Трубопровод к "типу" команды

Я хочу выяснить тип нескольких команд. Можно ли трубу или xargs результат поиска от find в type команда в линуксе?

Например:

find . -name anacron | type

или же

find . -name anacron | xargs type

2 ответа

Решение

type это не нормальная команда. Это скорлупа бутина. Увидеть:

$ type type
type is a shell builtin

Итак, вам нужно вызвать bash с -c добиться того, что вы хотите

$ find . -name anacron | xargs -I '{}'  bash -c "type {}"

Или даже проще (не нужно xargs):

$ find . -name anacron -exec bash -c "type {}"  \;

Будет звонить bash -c "type ./file", с каждым файлом, который найден find, -I в xargs значит, мы определяем здесь заполнитель {} использовать позже. Этот заполнитель заменяется найденным именем файла.

Почему встроенные оболочки не работают с xargs :

[...] Встроенные команды содержатся внутри самой оболочки. Когда имя встроенной команды используется в качестве первого слова простой команды, оболочка выполняет команду напрямую, без вызова другой программы. [...]


xargs читает элементы из стандартного ввода [...] и выполняет команду

Команда в этом случае является простой исполняемой, а встроенная оболочка не является исполняемым файлом. Его нельзя найти в файловой системе. Это внутри самой оболочки. Таким образом, вы должны вызвать оболочку и сказать вызываемой оболочке вызвать встроенную команду. Вот что случилось с bash -c "command",

Здесь есть несколько проблем (некоторые уже выделены):

  • type является встроенным Это не команда, которая решена, это функция внутри bash. Увидеть man bash-builtins, Это работает только в контексте Bash, так что не xargs или же -exec раздвоенная оболочка.
  • type используется для поиска собственного пути. Если вы дадите ему путь (как find обычно), он, вероятно, просто вернет этот путь. readlink -f может быть лучше, если вы просто пытаетесь разрешить символические ссылки; и вы можете в трубку xargs readlink или же -exec readlink -f {} + весь день напролет.

Это не значит, что вы не можете делать то, что пытаетесь. Есть два варианта. type Команда может обрабатывать несколько имен одновременно, так что вы можете просто указать все имена сразу:

type $(find /usr/sbin -name anacron)

Для многих команд, если слишком много аргументов, вы превысите ограничение длины командной строки (см. getconf ARG_MAX). Однако это не будет применяться в этом случае, так как type встроен в оболочку и не генерирует новый идентификатор процесса (ограничение длины применяется к функции exec(), используемой дочерним процессом в обычной командной строке).

Другие вопросы по тегам