/
POSIX PATH kuralı için gerekçe
Kural şurada belirtildi: Bash'da çalıştırmak için neden çalıştırılabilir dosyadan veya komut dosyası adından önce ./ (dot-slash) gerekiyor? ama bunun neden iyi bir tasarım olduğunu düşündüğümü daha ayrıntılı olarak açıklamak istiyorum.
İlk olarak, kuralın açık bir tam sürümü:
- yol içeriyorsa
/
(örn ./someprog
. /bin/someprog
, ./bin/someprog
): CWD kullanılır ve PATH kullanılmaz
- yol içermiyorsa
/
(örn. someprog
): PATH kullanılır ve CWD kullanılmaz
Şimdi şunu varsayalım:
someprog
arayacaktı:
- önce CWD'ye göre
- sonraki PATH ile ilgili
Sonra, /bin/someprog
dağıtımınızdan kaçmak istiyorsanız ve şunları yaptınız:
someprog
bazen işe yarayabilir, ancak diğerleri başarısız olur, çünkü başka bir ilgisiz someprog
program içeren bir dizinde olabilirsiniz .
Bu nedenle, yakında bunun güvenilir olmadığını öğreneceksiniz ve PATH kullanmak istediğinizde her zaman mutlak yollar kullanacaksınız, bu nedenle PATH'ın amacını yeneceksiniz.
Bu yüzden PATH'nizde göreli yollara sahip olmak gerçekten kötü bir fikirdir. Sana bakıyorumnode_modules/bin
.
Tersine, şu koşuyu varsayalım:
./someprog
Arama:
- önce PATH'a göre
- sonraki CWD'ye göre
Daha sonra, someprog
bir git deposundan bir komut dosyası indirdiyseniz ve CWD'den çalıştırmak istiyorsanız, bunun çalıştırılacak gerçek program olduğundan asla emin olmazsınız, çünkü belki de dağıtımınız şunları içerir:
/bin/someprog
geçen yıl Noel'den sonra çok fazla içtikten sonra kurduğunuz paketten PATH içinde.
Bu nedenle, bir kez daha, ne çalıştırdığınızı bilmek için her zaman CWD'ye göre yerel komut dosyalarını tam yollarla çalıştırmak zorunda kalacaksınız:
"$(pwd)/someprog"
bu da son derece can sıkıcı olurdu.
Gelmek isteyebileceğiniz başka bir kural:
göreli yollar yalnızca PATH, yalnızca mutlak yollar CWD kullanır
ancak bir kez daha bu, kullanıcıları PATH olmayan komut dosyaları için her zaman mutlak yollar kullanmaya zorlar "$(pwd)/someprog"
.
/
Yol arama kuralı hakkında sorununa çözüm hatırlamak için bir basit sunmaktadır:
- eğik çizgi: kullanma
PATH
- eğik çizgi yok: sadece kullanın
PATH
bu da, geçerli dizindeki dosyaların ya ./somefile
veya olarak ifade edilebileceğine güvenerek, her zaman ne çalıştırdığınızı bilmenizi kolaylaştırır somefile
ve böylece bunlardan birine özel bir anlam verir.
Bazen, some/prog
göreli olarak PATH
arayamayacağınız biraz sinir bozucu , ama bunun için daha akılcı bir çözüm görmüyorum.