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