Трубопровод к "типу" команды
Я хочу выяснить тип нескольких команд. Можно ли трубу или 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(), используемой дочерним процессом в обычной командной строке).