Saya pikir sebagian besar akrab dengan which
perintah, dan saya sering menggunakannya. Saya hanya mengalami situasi di mana saya ingin tahu bukan hanya perintah mana yang pertama kali berada di jalur saya, tetapi berapa banyak dan di mana semua perintah di semua jalur saya. Saya mencoba halaman manual mana (mengetik man which
membuat saya tertawa), tetapi tidak melihat apa-apa.
19
which --all
.which -a
.Jawaban:
Pada beberapa sistem,
which -a
tampilkan semua kecocokan. Jika shell Anda adalah bash atau zsh¹, Anda dapat menggunakantype
sebagai gantinya:type foo
menunjukkan kecocokan pertama dantype -a foo
menampilkan semua kecocokan. Tiga perintahtype
,which
danwhence
sebagian besar melakukan hal yang sama; mereka berbeda antara cangkang dan sistem operasi dalam ketersediaan, opsi, dan apa yang sebenarnya mereka laporkan.type
selalu tersedia dan menampilkan semua kemungkinan nama seperti perintah (alias, kata kunci, built-in shell, fungsi, dan perintah eksternal).Satu-satunya cara yang sepenuhnya portabel untuk menampilkan semua pertandingan adalah mengurai
$PATH
sendiri. Inilah skrip shell yang melakukan ini. Jika Anda menjadikannya fungsi shell, pastikan untuk melampirkan badan fungsi di dalam tanda kurung (sehingga perubahan keIFS
danset -f
tidak keluar dari fungsi), dan ubahexit
kereturn
.¹ Atau ksh 93, menurut dokumentasi, meskipun ksh 93s + 2008-01-31 hanya mencetak kecocokan pertama ketika saya mencoba.
sumber
sh
kode tidak bekerja dengan benar jika ada komponen yang kosong di$PATH
. Perhatikan juga bahwa pembatas$IFS
bidang (setidaknya dalam POSIX shells) saat dalam , titik dua digunakan sebagai pemisah bidang . Lihat skrip yang ditemukan di Debian untuk implementasi yang benar.$PATH
which
type
builtin diksh93u+ 2012-08-01
tampaknya bekerja dengan baik.Bendera --all atau -a akan menampilkan semua kecocokan di jalur Anda, dan alias (setidaknya di Fedora, Ubuntu, dan CentOS):
Pada AIX dan Solaris, ini akan membuat Anda lebih dekat:
sumber
$PATH
berisi karakter whitespace atau shell globbing.read -r
diperlukan untuk mengatasi backslash. Ini bukan metode yang baik karenafind
akan memakan waktu lama dan dapat mengembalikan kecocokan palsu jika direktori di$PATH
berisi subdirektori. Untungnya,find
tidak berguna di sini; lihat jawaban saya.Jika Anda tidak memiliki
which
pendukung-a
, atauwhence
tersedia, gulung sendiri:sumber
set -f
untuk mematikan globbing pada yang tidak dilindungi$PATH
.test -f
tidak cukup karena hanya file yang dapat dieksekusi yang diinginkan di sini; kamu membutuhkantest -x
. Hmm, saya sadar saya lupa tes file biasa dalam skrip saya.whence README.txt
tidak mungkinwhence "file* wi?h we!rd name"
. Hanya berusaha menunjukkan betapa mudahnya untuk melintasi$PATH
.ksh dan zsh memiliki "whence" sebagai shell built-in.
whence -a
melakukan apa yang Anda inginkan di bawah zsh:Saya harus membersihkan PATH di zsh, saya punya banyak duplikat di dalamnya.
whence -a
bekerja secara berbeda di bawah ksh:Saya harus mengatakan, itu sepertinya perilaku yang berpotensi berguna juga.
sumber