Oto funkcja, która wyświetla zawartość katalogów $PATH
. Jeśli przekazano argumenty, funkcja wyświetla tylko polecenia, których nazwa zawiera jeden z argumentów. Argumenty są interpretowane jako wzorce globalne.
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
}
Podobnie jak wiele rzeczy, jest to łatwiejsze w Zsh.
lspath () {
(($#)) || set ''
print -lr -- $^path/*$^@*(N:t) | sort -u
}
^
Postacią rozszerzalności parametrów powoduje tekst łączone z tablicy być dodawane do każdego elementu tablicy, np path=(/bin /usr/bin); echo $^path/foo
nadrukami /bin/foo /usr/bin/foo
.
/*$^@*
wygląda jak obraza z komiksu, ale w rzeczywistości jest zwykłym znakiem /
, symbolem wieloznacznym *
, parametrem specjalnym $@
(tablicą parametru pozycyjnego) z ^
modyfikatorem i ponownie *
.
(N:t)
jest globalnym kwalifikatorem N
do uzyskania pustego rozszerzenia, jeśli nie ma dopasowania, po którym następuje modyfikator historii, t
aby zachować tylko basename („tail”) każdego dopasowania.
Bardziej tajemniczy, pozwala uniknąć połączenia zewnętrznego, ale ma to jedynie znaczenie kosmetyczne:
lspath () {
(($#)) || set ''
local names; names=($^path/*$^@*(N:t))
print -lr -- ${(ou)names}
}
Być może faktycznie szukasz apropos
polecenia, które wyszukuje strony podręcznika poleceń, których krótki opis zawiera słowo kluczowe. Ograniczeniem jest to, że znajdują się tylko polecenia, które mają stronę man.
ls -la
?