Jika saya menjalankan test
perintah dalam bash, test
(mengevaluasi ekspresi kondisional) utilitas bawaan dimulai:
$ type test
test is a shell builtin
$ type -a test
test is a shell builtin
test is /usr/local/bin/test
test is /usr/bin/test
$
Namun, seperti yang terlihat pada output di type -a test
atas, ada test
direktori lain di / usr / local / bin dan satu lagi di direktori / usr / bin. Bagaimana perintah yang dapat dieksekusi, yaitu apakah perintah bawaan selalu lebih disukai dan kemudian perintah lainnya bergantung pada urutan direktori dalam variabel $ PATH? Selain itu, apakah mungkin untuk mengubah urutan executable yang dimulai, mis. Jika saya mengetik test
, maka / usr / bin / test dimulai bukannya bash-builtin test
?
bash
shell
command
shell-builtin
Martin
sumber
sumber
/usr/bin/test -f "$file"
...Jawaban:
Prioritas tertinggi adalah alias bash, lalu builtin khusus (hanya dalam mode POSIX), lalu berfungsi, lalu builtin, lalu pencarian masuk
$PATH
.Untuk menjalankan builtin, gunakan
builtin test
.Untuk menjalankan aplikasi eksternal, menggunakan path eksplisit:
/bin/test
.Untuk mengabaikan fungsi dan alias, gunakan
command test
.Untuk mem-bypass alias saja, gunakan
\test
atau jenis ekspansi lainnya.Dimungkinkan untuk menonaktifkan / mengaktifkan builtin dengan
enable test
.(Diperbarui menurut komentar di bawah)
(Memperbaiki edit admin yang salah yang dibangun oleh bash
disable
- pada kenyataannya, hanya adaenable
)sumber
\test
atau'test'
atautes't'
./
,$
, backtick, dan=
dan salah satu karakter meta shell atau mengutip karakter yang tercantum di atas mungkin tidak muncul dalam nama alias. "Perintah bawaan selalu lebih disukai daripada perintah eksternal. Rasionalnya adalah bahwa perintah bawaan lebih cepat (dan dalam beberapa kasus, seperti
cd
atau , hanya perintah bawaan yang dapat memiliki efek yang diinginkan).test -o BASH_OPTION
Terkadang perintah eksternal mungkin memiliki kapabilitas yang tidak dimiliki shell builtin. Dalam hal ini, Anda dapat memanggil perintah eksternal dengan memberikan jalur eksplisit (yaitu berisi garis miring) (ini memintas kekhawatiran tentang urutan masuk
$PATH
). Jika Anda tidak ingin melakukan hard-code pada jalur eksternal tetapi Anda ingin mencegah penggunaan builtin, Anda dapat menggunakan"$(type -P test)"
(modal catatanP
) dalam bash,"$(whence -p test)"
di ksh, dan=test
di zsh. Cara lain untuk memaksa penggunaan perintah eksternal adalah dengan menggunakancommand
builtin (command -p test …
) atau melaluienv
utilitas (env test …
).Di zsh, Anda dapat menonaktifkan bawaan dengan
disable test
. Ini permanen (untuk shell atau subkulit saat ini) sampai builtin diaktifkan kembali denganenable test
. Dalam bash, Anda dapat melakukan hal yang samaenable -n test
untuk menonaktifkan danenable test
mengaktifkan kembali.Anda dapat menggunakan alias atau fungsi untuk memaksa pelaksanaan perintah yang berbeda, misalnya
alias test=/usr/bin/test
atautest () { /usr/bin/test "$@"; }
. Jika Anda memiliki alias seperti itu, Anda dapat mencegah penggunaannya dengan mengutip bagian mana pun darinya, mis.\test
Akan melakukan fungsi normal / builtin / pencarian eksternal. Perhatikan bahwa tergantung pada shell dan pengaturannya, definisi alias dalam suatu fungsi dapat diperluas ketika suatu fungsi dibaca atau ketika dijalankan. Jika Anda telah mendefinisikan suatu fungsi, Anda dapat menggunakancommand test
untuk mencegah pencarian fungsi serta pencarian alias (jadi di sinitest
builtin akan dipanggil kecuali dinonaktifkan).sumber
env
akan cocok di sini juga?df
ke PATH pada posisi pertama, dihapus alias 'df',which df
menunjukkan / opt / bin / df, tetapi df berjalan / bin / df -> busyboxwhich df
tidak selalu menunjukkan kepada Anda apa yangdf
berjalan. unix.stackexchange.com/questions/85249/...