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