Я хочу з’ясувати тип кількох команд. Чи можна труби або в xargs
результаті пошуку з find
в type
команди в Linux?
Наприклад:
find . -name anacron | type
або
find . -name anacron | xargs type
Я хочу з’ясувати тип кількох команд. Чи можна труби або в xargs
результаті пошуку з find
в type
команди в Linux?
Наприклад:
find . -name anacron | type
або
find . -name anacron | xargs type
Відповіді:
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"
.
find ... -exec bash -c 'type "$@"' _ {} +
Тут є кілька проблем (деякі з яких уже виділено):
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 (), що використовується дочірнім процесом у звичайному командному рядку).