Перехід до команди "type"


10

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

Наприклад:

find . -name anacron | type

або

find . -name anacron | xargs type

Я думаю, що відповідь Олі - найкраща відповідь. Відповідь на хаос просто працює, але Олі відповідь розумна.
Геліо

Відповіді:


17

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


3
Ви можете це конденсувати доfind ... -exec bash -c 'type "$@"' _ {} +
муру

2
@muru дійсно, я знову прочитав власну відповідь і побачив це =)
хаос

11

Тут є кілька проблем (деякі з яких уже виділено):

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


1
Дякую Олі! Цей новачок у Linux сьогодні дізнався щось нове щодо "типу" та його поведінки.
LjinKazama
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.