Вот функция, которая перечисляет содержимое каталогов $PATH. Если переданы аргументы, функция перечисляет только те команды, имя которых содержит один из аргументов. Аргументы интерпретируются как шаблоны глобуса.
shopt -s extglob
lspath () {
local IFS pattern
IFS='|'
pattern="*@($*)*"
IFS=':'
for d in $PATH; do
for x in "$d/"$pattern; do
[ "$x" = "$d/$pattern" ] || echo "${x##*/}"
done
done | sort -u
}
Как и многие вещи, это проще в Zsh.
lspath () {
(($#)) || set ''
print -lr -- $^path/*$^@*(N:t) | sort -u
}
Символ ^в раскрытии параметра вызывает добавление текста, объединенного с массивом, к каждому элементу массива, например, к path=(/bin /usr/bin); echo $^path/fooотпечаткам /bin/foo /usr/bin/foo.
/*$^@*выглядит как оскорбление комиксов, но на самом деле это обычный символ /, подстановочный знак *, специальный параметр $@(массив позиционных параметров) с ^модификатором и снова *.
(N:t)является префиксом glob N для получения пустого раскрытия, если нет совпадения, за которым следует модификатор history, t чтобы сохранить только базовое имя («tail») для каждого совпадения.
Более загадочный, избегает внешнего звонка, но это только косметический интерес:
lspath () {
(($#)) || set ''
local names; names=($^path/*$^@*(N:t))
print -lr -- ${(ou)names}
}
На самом деле вы можете искать aproposкоманду, которая ищет справочные страницы команд, краткое описание которых содержит ключевое слово. Ограничение состоит в том, что это находит только те команды, которые имеют справочную страницу.
ls -la?