Я хочу узнать тип нескольких команд. Возможно ли передать по конвейеру или xargs
результат поиска find
в type
команду в Linux?
Например:
find . -name anacron | type
или
find . -name anacron | xargs type
command-line
bash
find
LjinKazama
источник
источник
Ответы:
type
это не нормальная команда. Это скорлупа бутина. Увидеть:Итак, вам нужно обратиться
bash
с помощью,-c
чтобы достичь того, что вы хотитеИли даже проще (не нужно
xargs
):Он будет вызывать
bash -c "type ./file"
каждый найденный файлfind
.-I
вxargs
смысле, мы определяем здесь заполнитель{}
для использования позже. Этот заполнитель заменяется найденным именем файла.Почему встроенные оболочки не работают с
xargs
:Команда в этом случае является простой исполняемой, а встроенная оболочка не является исполняемым файлом. Его нельзя найти в файловой системе. Это внутри самой оболочки. Таким образом, вы должны вызвать оболочку и сказать вызываемой оболочке вызвать встроенную команду. Вот что случилось с
bash -c "command"
.источник
find ... -exec bash -c 'type "$@"' _ {} +
Здесь есть несколько проблем (некоторые уже выделены):
type
является встроенным Это не команда, которая решена, это функция внутри bash. Смman bash-builtins
. Он работает только в контексте bash, поэтому не является раздвоеннымxargs
или-exec
раздвоенным.type
используется для поиска собственного пути. Если вы дадите ему путь (какfind
обычно), он, вероятно, просто вернет этот путь.readlink -f
может быть лучше, если вы просто пытаетесь разрешить символические ссылки; и вы можете трубитьxargs readlink
или-exec readlink -f {} +
целый день.Это не значит, что вы не можете делать то, что пытаетесь. Есть два варианта. Команда
type
может обрабатывать много имен одновременно, так что вы можете просто указать все имена сразу:Для многих команд, если слишком много аргументов, вы превысите ограничение длины командной строки (см.
getconf ARG_MAX
). Однако это не будет применяться в этом случае, посколькуtype
встроено в оболочку и не генерирует новый идентификатор процесса (ограничение длины применяется к функции exec (), используемой дочерним процессом в обычной командной строке).источник