Ось функція, яка перераховує вміст каталогів $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)
є глобальним класифікатором N
для отримання порожнього розширення, якщо немає відповідності, за яким модифікатор історії t
зберігає лише базове ім'я ("хвіст") кожного матчу.
Більш криптовалюта, уникає зовнішнього дзвінка, але це лише для косметичного інтересу:
lspath () {
(($#)) || set ''
local names; names=($^path/*$^@*(N:t))
print -lr -- ${(ou)names}
}
Насправді ви можете шукати apropos
команду, яка шукає довідні сторінки команд, короткий опис яких містить ключове слово. Обмеження полягає в тому, що це знаходять лише команди, які мають довідкову сторінку.
ls -la
?