Uzasadnienie dla /
reguły POSIX PATH
Reguła została wspomniana na stronie: Dlaczego potrzebujesz ./ (kropka-ukośnik) przed nazwą pliku wykonywalnego lub skryptu, aby uruchomić ją w trybie bash? ale chciałbym bardziej szczegółowo wyjaśnić, dlaczego uważam, że to dobry projekt.
Po pierwsze, wyraźna pełna wersja reguły to:
- Jeśli ścieżka zawiera
/
(na przykład ./someprog
, /bin/someprog
,./bin/someprog
) CWD jest używany i ścieżka nie jest
- jeśli ścieżka nie zawiera
/
(np. someprog
): używana jest ŚCIEŻKA, a CWD nie
Załóżmy teraz, że działa:
someprog
szukałby:
- względem CWD pierwszy
- względem PATH po
Następnie, jeśli chcesz uciec /bin/someprog
z dystrybucji, a zrobiłeś:
someprog
czasami to działałoby, ale innym się nie udawało, ponieważ możesz znajdować się w katalogu, który zawiera inny niepowiązany someprog
program.
Dlatego wkrótce dowiesz się, że nie jest to wiarygodne, i zawsze będziesz używał ścieżek bezwzględnych, gdy chcesz użyć ŚCIEŻKI, co pokona cel ŚCIEŻKI.
Dlatego też posiadanie ścieżek względnych w ŚCIEŻCE jest naprawdę złym pomysłem. Ja patrząc na ciebie,node_modules/bin
.
I odwrotnie, załóżmy, że działa:
./someprog
Wyszukiwałby:
- względem PATH pierwszy
- względem CWD po
Następnie, jeśli właśnie pobrałeś skrypt someprog
z repozytorium git i chciałbyś go uruchomić z CWD, nigdy nie byłbyś pewien, że to byłby właściwy program, ponieważ może twoja dystrybucja ma:
/bin/someprog
który jest w TWOJEJ ŚCIEŻCE z jakiegoś pakietu, który zainstalowałeś po wypiciu za dużo po Bożym Narodzeniu w zeszłym roku.
Dlatego po raz kolejny będziesz zmuszony zawsze uruchamiać lokalne skrypty względem CWD z pełnymi ścieżkami, aby wiedzieć, co uruchamiasz:
"$(pwd)/someprog"
co byłoby również bardzo denerwujące.
Kolejną zasadą, którą możesz pokusić się o wymyślenie, byłoby:
ścieżki względne używają tylko PATH, ścieżki bezwzględne tylko CWD
ale po raz kolejny zmusza to użytkowników do korzystania ze ścieżek bezwzględnych dla skryptów innych niż PATH "$(pwd)/someprog"
.
/
Reguła przeszukiwanie ścieżki oferuje prosty do zapamiętania rozwiązanie dotyczące problemu:
- ukośnik: nie używaj
PATH
- bez ukośnika: tylko użyj
PATH
co sprawia, że bardzo łatwo jest zawsze wiedzieć, co się uruchamia, polegając na tym, że pliki w bieżącym katalogu można wyrazić jako ./somefile
lub somefile
, i dlatego nadaje to jednemu z nich specjalne znaczenie.
Czasami jest trochę denerwujące, że nie można szukać some/prog
krewnego PATH
, ale nie widzę rozsądniejszego rozwiązania tego problemu.