Я хочу выяснить тип нескольких команд. Возможно ли передать или xargs
результат поиска из find
в команду type
в Linux?
Например:
find . -name anacron | type
или
find . -name anacron | xargs type
type
не нормальная команда. Это - оболочка buitin. См.:
$ 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
средства, мы определяем здесь заполнителя {}
использовать позже. Этот заполнитель заменяется найденным именем файла.
Почему оболочка builtins не работает с xargs
:
[...] Встроенные команды содержатся в самой оболочке. Когда название встроенной команды используется в качестве первого слова простой команды, оболочка выполняет команду непосредственно, не вызывая другую программу. [...]
xargs читает объекты из стандартного входа, [...], и выполняет команду
Команда в этом случае является простым excutable, и встроенная оболочка не является исполняемым файлом. Это не может быть найдено в файловой системе. Это в самой оболочке. Таким образом, необходимо назвать оболочку и сказать названной оболочке вызывать встроенную команду. Это - то, что произошло с bash -c "command"
.
Существует несколько проблем здесь (некоторые уже выделенные):
type
встроенное. Это не команда, это разрешено, это - функция в ударе. См. man bash-builtins
. Это только работает в контексте удара так не xargs
или -exec
разветвленная подоболочка. type
привык делать его собственный поиск пути. Если Вы дадите ему путь (поскольку find
имеет привычку делать), это, вероятно, просто возвратит тот путь. readlink -f
могло бы быть лучше, если Вы просто пытаетесь разрешить символьные ссылки; и можно передать по каналу в xargs readlink
или -exec readlink -f {} +
целый день. Но это вовсе не значит Вы не можете сделать то, что Вы пытаетесь. Существует две опции. Эти type
управляют, может обработать много имен сразу, таким образом, Вы могли просто предоставить всему этому имена сразу:
type $(find /usr/sbin -name anacron)
Для многих команд, если существует слишком много аргументов, Вы превысите предел длины командной строки (см. getconf ARG_MAX
). Однако это не будет применяться в этом случае, с тех пор type
встроен в оболочку и не генерирует новый идентификатор процесса (предел длины относится должностное лицо () функция, используемая дочерним процессом в нормальной командной строке).