Трубопровод для «ввода» команды

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

Например:

find . -name anacron | type

или

find . -name anacron | xargs type
10
задан 26 May 2015 в 09:24

2 ответа

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".

17
ответ дан 26 May 2015 в 09:24

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

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

0
ответ дан 26 May 2015 в 09:24

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

Похожие вопросы: