Вот функция, которая перечисляет содержимое каталогов $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
?