Standar shell POSIX mengatakan di situs ini
http://pubs.opengroup.org/onlinepubs/9699919799/
tentang bagaimana shell digunakan PATH
untuk mencari file yang dapat dieksekusi:
"Daftar harus dicari dari awal hingga akhir, menerapkan nama file untuk setiap awalan, sampai file yang dapat dieksekusi dengan nama yang ditentukan dan izin eksekusi yang sesuai ditemukan."
Nah, ini bukan bagaimana ini tampaknya bekerja dalam implementasi POSIX nyata:
man which
mengatakan:
"Mengembalikan nama path file (atau tautan) yang akan dieksekusi di lingkungan saat ini, seandainya argumennya diberikan sebagai perintah dalam shell yang benar-benar sesuai POSIX. Ia melakukan ini dengan mencari PATH untuk file yang dapat dieksekusi yang cocok dengan nama-nama argumen. Itu tidak mengikuti tautan simbolis. "
OK, mari kita lihat situasi ini:
$ pwd
/home/mark
$ echo $PATH
/home/mark/bin:
...
$ ls -l bin/foobar
lrwxrwxrwx 1 mark mark 18 Dec 12 22:51 bin/foobar -> /home/mark/foobar1
$ touch foobar1
$ which foobar
$ chmod a+x foobar1
$ which foobar
/home/mark/bin/foobar
OK, di sini ada tautan simbolik PATH
dengan nama yang benar, dan dilaporkan ls
dapat dieksekusi.
which
tidak melihatnya sama sekali, tetapi hanya tertarik pada apa yang ditunjukkannya.
Terlepas dari kenyataan bahwa keduanya man which
secara eksplisit mengatakan bahwa itu tidak mengikuti tautan simbolik (dan memang kita melihatnya tidak, karena which foobar
tidak mencetak foobar1
), dan juga dokumentasi shell POSIX yang dikutip di atas, tidak pernah menyebutkan symlink berikut dalam PATH
algoritma.
Jadi, apakah which
kerang yang ada salah, atau apakah saya tidak memahami dokumentasinya?
UNTUK MEMPERJELAS:
Saya tahu dan bisa menjelaskan perilaku yang ada. Pertanyaan saya bukanlah "bagaimana cara kerjanya?". Itu saya tahu.
Pertanyaan saya adalah tentang dokumentasi: di mana kesalahan saya dalam mengikuti dokumentasi yang saya kutip. Atau apakah dokumentasinya salah?
MOTIVASI: Mengapa saya peduli?
Ya, saya pelaksana. Pelaksana yang berbeda memiliki persyaratan yang berbeda pula. Bagi saya, persyaratannya adalah bahwa kata dari standar POSIX saat ini HARUS diikuti secara TEPAT (atau, lebih tepatnya, yang terbaik, karena, standarnya sendiri agak buggy). Seperti itu adalah firman Tuhan.
Sekarang, kata-kata standarnya cukup jelas - symlink berikut tidak disebutkan, di mana di banyak tempat lain, disebutkan di mana itu perlu dilakukan. Jadi dalam hal ini, jangan.
Namun, saya selalu mengecek bagaimana dash
dan bash
berperilaku, hanya untuk memastikan. Sekarang tentu saja, ada sedikit masalah di sini juga, dash
meskipun itu disebut sebagai POSIX, memiliki banyak bug kecil yang sesuai dengan POSIX. bash
, Saya belum menemukan bug dengan POSIX, tapi ... bash sebenarnya bukan POSIX, itu lebih dari itu.
Jadi begitulah. Itu sebabnya saya peduli.
$PATH
tidak memiliki symlink.
lstat(2)
), mengikuti mereka biasanya tidak dinyatakan. Misalnya, deskripsi open(2)
hanya menyebutkan symlink ketika berbicara tentang perilaku O_CREAT | O_EXCL
. Tidak perlu menyatakan bahwa file target akan dibuka.
$PATH
dapat berisi symlink. Cobawhich sh
.