POSIX kabuk standardı bu sitede diyor
http://pubs.opengroup.org/onlinepubs/9699919799/
mermilerin PATH
yürütülebilir dosyaları aramak için nasıl kullandığı hakkında :
Msgstr "Belirtilen ada ve uygun yürütme izinlerine sahip yürütülebilir bir dosya bulunana kadar liste her bir önek için dosya adı uygulanarak baştan sona aranacaktır."
Eh, bu gerçek POSIX uygulamasında böyle görünmüyor:
man which
diyor:
msgstr "" "" ifadeleri, geçerli bir ortamda yürütülecek dosyaların (veya bağlantıların) yol adlarını döndürür, argümanları kesinlikle POSIX uyumlu bir kabukta komutlar olarak verilmişti. Bunu, PATH'yi Sembolik bağlantıları takip etmiyor. "
Tamam, şu duruma bakalım:
$ 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
Tamam, burada PATH
doğru adla sembolik bir bağlantı var ve çalıştırılabilir olduğu bildiriliyor ls
.
which
hiç bakmıyor, sadece neyi işaret ettiği ile ilgileniyor.
Her ikisinin de man which
açıkça sembolik bağlantıları takip etmediğini (ve aslında görmediğini, çünkü which foobar
yazdırmadığını foobar1
) ve aynı zamanda yukarıda belirtilen POSIX kabuk belgelerinin PATH
algoritmada sembollerden sonra asla bahsetmediğine rağmen .
Peki which
ve mevcut mermiler yanlış mı yoksa belgeleri anlamıyorum mı?
NETLEŞTİRMEK İÇİN:
Mevcut davranışı bilir ve açıklayabilirim. Sorum "bu nasıl çalışıyor?" Değil. Bunu biliyorum.
Benim sorum dokümanlarla ilgili: alıntıladığım dokümanları takip etme konusundaki hatam nerede. Yoksa dokümantasyon yanlış mı?
MOTİVASYON: Neden umursuyorum?
Ben bir uygulayıcıyım. Farklı uygulayıcıların farklı gereksinimleri vardır. Benim için şart, mevcut POSIX standardının kelimesinin TAM OLARAK (veya daha doğrusu, en iyisi olabileceğinden, ZORUNLU) takip edilmesi GEREKİR. Tıpkı Tanrı'nın sözü gibi.
Şimdi, standart ifadeler oldukça açıktır - aşağıdaki sembollerden bahsedilmemektedir, diğer birçok yerde nerede yapılması gerektiği belirtilmektedir. Bu durumda, yapma.
Ancak, emin olmak için her zaman nasıl dash
ve bash
davranış yaptığımı iki kez kontrol ederim . Tabii ki, burada da küçük bir sorun var, dash
POSIX olarak faturalandırılsa bile, POSIX'e uygun birçok küçük hata var. bash
, POSIX ile ilgili herhangi bir hata bulamadım, ama ... bash aslında POSIX değil, bundan çok daha fazlası.
İşte burada. Bu yüzden umursuyorum.
$PATH
herhangi bir sembolik bağ yok.
lstat(2)
), bunları takip etmek genellikle belirtilmez. Örneğin, open(2)
sadece tanımı , davranışlarından bahsederken sembolik bağlantılardan bahseder O_CREAT | O_EXCL
. Hedef dosyanın açılacağını belirtmeye gerek yoktur.
$PATH
sembolik semboller içerebilir. Deneyinwhich sh
.