Saya perlu menemukan jalur program yang diberikan pada PATH
menggunakan skrip shell. Path harus path lengkap aktual dari program, yang dapat diteruskan kemudian ke salah satu exec*
fungsi, yang tidak mencari PATH
sendiri, misalnya execv
.
Ada beberapa program seperti kill
, yang tersedia sebagai program aktual dan shell built-in pada saat bersamaan. Jika ini kasusnya, saya perlu path lengkap ke program yang sebenarnya.
Ada beberapa utilitas yang dapat menemukan program pada PATH
sebagaimana ditentukan dalam Bagian 2.9.1.1, Pencarian Perintah dan Eksekusi standar POSIX .
Ada which
, yang bukan bagian dari standar apa pun. Ini bisa menjadi program reguler pada beberapa sistem, sedangkan beberapa shell memberikannya builtin. Tampaknya tersedia di sebagian besar sistem dan shell, tetapi shell dengan versi builtin, juga hanya mengembalikan nama built-in alih-alih jalur ke executable. Juga tidak dibakukan dengan cara apa pun dan dapat mengembalikan output apa pun dan mengambil opsi yang berbeda.
bash# which kill
/usr/bin/kill
dash# which kill
/usr/bin/kill
fish# which kill
/usr/bin/kill
mksh# which kill
/usr/bin/kill
tcsh# which kill
kill: shell built-in command.
zsh# which kill
kill: shell built-in command
Ada whence
, yang merupakan built-in dari beberapa cangkang. Tetapi tidak tersedia pada banyak kerang. Itu juga akan mengembalikan nama built-in bukan path ke program. A -p
dapat diteruskan ke mana untuk mengubah perilaku ini.
bash# whence kill
bash: whence: command not found
dash# whence kill
dash: 1: whence: not found
fish# whence kill
fish: Unknown command 'whence'
mksh# whence kill
kill
mksh# whence -p kill
/usr/bin/kill
tcsh# whence kill
whence: Command not found.
zsh# whence kill
kill
zsh# whence -p kill
/usr/bin/kill
Ada command
builtin yang ditentukan oleh POSIX: 2008 . Sayangnya itu juga mencari perintah reguler dan built-in dan akan mengembalikan nama built-in bukan path ke program yang dibayangi oleh built-in dengan nama yang sama. Beberapa shell lama belum mengimplementasikannya.
bash# command -v kill
kill
dash# command -v kill
kill
fish# command -v kill
/usr/bin/kill
mksh# command -v kill
kill
tcsh# command -v kill
command: Command not found.
zsh# command -v kill
kill
enable
dispesifikasikan dalam POSIX atau tidak, tetapi jika ya, Anda dapat menggunakanenable -n which
untuk menonaktifkan shell bawaan untukwhich
.realpath
enable
hanya disediakan olehbash
danzsh
type -p
. Baik bash dan dash membiarkan Anda mengatakancommand
perintah untuk menjalankan executable yang sebenarnya bahkan jika ada fungsi atau builtin dengan nama yang sama.command
melewatkan fungsi (dan alias) tetapi BUKAN bawaan, seperti yang dikatakan Q dengan benar. Dan Anda tidak dapat selalu menggunakan shebang karena tidak ada jalur yang mendapatkan shell yang diberikan, atau bahkan beberapa shell POSIX, di semua sistem.Jawaban:
Cukup cari sendiri.
Diuji di
bash
,dash
,ksh
,mksh
,zsh
Memperbarui
Di atas bagus untuk skrip yang berdiri sendiri namun jika Anda berencana menyematkan ini ke skrip yang lebih besar, Anda mungkin ingin menggunakan sesuatu yang lebih seperti berikut ini.
Hal ini dimaksudkan agar
IFS
dipulihkan setelah menemukan pertandingan, juga bertukarexit
's denganreturn
' ssumber
IFS
variabel? Tidakkah cukup dengan set ini di shell lokal? Berbicara tentang lokal, apakahlocal IFS
akan portabel? Hal di atas dapat berinteraksi dengan buruk jika sesuatu yang lain menyimpan IFS dengan cara yang sama. Melihat pertanyaan ini di SE ,local
dapat bekerja untuk sebagian besar shell meskipun tidak POSIX. Memasukkan versi asli ke dalam(…)
subkulit mungkin juga berfungsi.