Ось функція, яка перераховує вміст каталогів $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?