Apakah POSIX menjamin bahwa utilitas standar ada di PATH?

11

Di bagian "Pencarian dan Eksekusi Perintah" , spesifikasi POSIX mengatakan yang PATHdicari ketika menemukan utilitas untuk dieksekusi (dengan beberapa pengecualian). Apakah spesifikasi menyebutkan di mana saja yang PATHakan diinisialisasi ke nilai yang menjamin bahwa semua utilitas standar akan ditemukan?

Atau apakah saya perlu melakukan sesuatu seperti yang berikut untuk menjamin bahwa saya tidak akan pernah mendapatkan kesalahan "perintah tidak ditemukan" ketika mencoba menjalankan utilitas standar?

PATH=$(command -p sh -c 'printf %s "${PATH}"')

(lihat spesifikasi POSIX dari commandutilitas )

Richard Hansen
sumber

Jawaban:

13

Iya dan tidak. Dalam lingkungan POSIX, utilitas harus berperilaku seperti yang dijelaskan oleh spesifikasi. Dalam praktiknya, ini berarti bahwa versi yang sesuai dari utilitas harus ada $PATH. Namun, saat menjalankan program Anda pada sistem yang mendukung POSIX, Anda mungkin menjalankannya di lingkungan yang tidak sesuai. Dalam praktiknya, yang sering terjadi adalah bahwa OS memiliki mode lama dan mode POSIX, dan secara default ada dalam mode lama. Lebih buruk daripada melewatkan beberapa perintah, mode warisan cenderung memiliki ketidakcocokan di dalamnya, seperti opsi dengan makna yang berbeda.

Anda dapat mengambil barang PATHdengan getconf. Tentu saja, ini rumit, karena getconfyang asli $PATHmungkin bukan yang benar. Penggunaan Aplikasi untuk perintah menunjukkan cara untuk melakukannya:

command -p getconf PATH

Sejauh yang saya mengerti spesifikasinya, ini tidak perlu jika Anda menjalankan program Anda di lingkungan yang sesuai dengan POSIX; dan jika Anda tidak menjalankan program Anda dalam lingkungan yang sesuai dengan POSIX, POSIX tidak berlaku. Namun, penggunaan aplikasi ini dapat dianggap sebagai rekomendasi: jika ini tidak berhasil, Anda dapat merasa berhak untuk mengeluh kepada vendor Anda bahwa apa pun yang mereka lakukan terkait dengan surat spesifikasi POSIX, mereka tidak mematuhi semangatnya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Heh, saya bahkan tidak menyadarinya getconf PATHdi bagian penggunaan aplikasi. Terima kasih!
Richard Hansen