Ini adalah aturan "seolah-olah".
Sederhananya: Perilaku shell seperti yang dilihat pengguna tidak boleh berubah jika implementasi memutuskan untuk membuat perintah eksternal standar juga tersedia sebagai shell built-in.
Kontras yang saya perlihatkan di /unix//a/496291/5132 antara perilaku (di satu sisi) PD Korn, MirBSD Korn, dan kerang Heirloom Bourne; (di sisi lain) kerang Z, 93 Korn, Bourne Again, dan Debian Almquist; dan (di genggaman tangan) cangkang Watanabe menyoroti ini.
Untuk shell yang tidak memiliki printf
built-in, mengeluarkan /usr/bin
dari PATH
membuat doa printf
berhenti bekerja. Perilaku konforman POSIX, yang diperagakan oleh shell Watanabe dalam mode konformannya, menyebabkan hasil yang sama. Perilaku shell yang memiliki printf
built-in adalah seolah-olah menjalankan perintah eksternal.
Sedangkan perilaku semua shell yang tidak sesuai tidak berubah jika /usr/bin
dihapus dari PATH
, dan mereka tidak berperilaku seolah-olah mereka memohon perintah eksternal.
Apa yang standar coba jamin untuk Anda adalah bahwa shell dapat membangun semua jenis perintah eksternal biasanya (atau mengimplementasikannya sebagai fungsi shell sendiri), dan Anda masih akan mendapatkan perilaku yang sama dari built-in seperti yang Anda lakukan dengan perintah eksternal jika Anda menyesuaikan PATH
untuk menghentikan perintah yang ditemukan. PATH
tetap menjadi alat Anda untuk memilih dan mengendalikan perintah apa yang dapat Anda panggil.
(Seperti yang dijelaskan di /unix//a/448799/5132 , tahun lalu orang memilih kepribadian Unix mereka dengan mengubah apa yang ada di PATH
.)
Orang mungkin berpendapat bahwa membuat perintah selalu berfungsi terlepas dari apakah itu dapat ditemukan pada PATH
kenyataannya adalah titik membuat perintah eksternal biasanya built-in. (Itulah sebabnya nosh toolset saya baru saja mendapatkan printenv
perintah bawaan di versi 1.38. Meskipun ini bukan shell.)
Tetapi standar memberi Anda jaminan bahwa Anda akan melihat perilaku yang sama untuk perintah eksternal reguler yang tidak aktif PATH
dari shell seperti yang Anda lihat dari program non-shell lain yang menjalankan execvpe()
fungsi, dan shell tidak akan secara ajaib dapat jalankan (tampaknya) perintah eksternal biasa yang tidak dapat ditemukan oleh program lain dengan yang sama PATH
. Semuanya bekerja secara mandiri dari sudut pandang pengguna, dan PATH
merupakan alat untuk mengendalikan cara kerjanya.
Bacaan lebih lanjut