Berikut adalah fungsi yang mencantumkan konten direktori $PATH
. Jika melewati argumen, fungsi hanya mencantumkan perintah yang namanya mengandung salah satu argumen. Argumen diinterpretasikan sebagai pola glob.
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
}
Seperti banyak hal, ini lebih mudah di zsh.
lspath () {
(($#)) || set ''
print -lr -- $^path/*$^@*(N:t) | sort -u
}
The ^
karakter dalam ekspansi parameter menyebabkan teks bersambung dengan array yang akan ditambahkan ke setiap elemen array, misalnya path=(/bin /usr/bin); echo $^path/foo
cetakan /bin/foo /usr/bin/foo
.
/*$^@*
terlihat seperti penghinaan buku komik tetapi sebenarnya karakter biasa /
, wildcard *
, parameter khusus $@
(array parameter posisi) dengan ^
pengubah, dan lagi *
.
(N:t)
adalah kualifikasi glob N
untuk mendapatkan ekspansi kosong jika tidak ada pertandingan yang diikuti oleh pengubah sejarah t
untuk menjaga hanya nama belakang ("ekor") dari setiap pertandingan.
Lebih samar, menghindari panggilan eksternal tetapi ini hanya untuk kepentingan kosmetik:
lspath () {
(($#)) || set ''
local names; names=($^path/*$^@*(N:t))
print -lr -- ${(ou)names}
}
Anda mungkin sebenarnya sedang mencari apropos
perintah, yang mencari halaman manual dari perintah yang deskripsi singkatnya berisi kata kunci. Batasannya adalah ini hanya menemukan perintah yang memiliki halaman manual.
ls -la
?