Begründung für die /
POSIX PATH-Regel
Die Regel wurde erwähnt unter: Warum benötigen Sie ./ (Schrägstrich) vor der ausführbaren Datei oder dem Skriptnamen, um sie in Bash auszuführen? aber ich möchte näher erläutern, warum ich denke, dass dies ein gutes Design ist.
Erstens lautet eine explizite Vollversion der Regel:
- Wenn der Pfad enthält
/
( zum Beispiel ./someprog
, /bin/someprog
, ./bin/someprog
): CWD verwendet wird und ist nicht PATH
- Wenn der Pfad nicht enthält
/
(z. B. someprog
): PATH wird verwendet und CWD nicht
Angenommen, es läuft:
someprog
würde suchen:
- relativ zu CWD zuerst
- relativ zu PATH nach
Dann, wenn Sie /bin/someprog
von Ihrer Distribution weglaufen wollten und Sie taten:
someprog
es würde manchmal funktionieren, aber andere würden fehlschlagen, weil Sie sich möglicherweise in einem Verzeichnis befinden, das ein anderes nicht verwandtes someprog
Programm enthält .
Daher würden Sie bald feststellen, dass dies nicht zuverlässig ist, und Sie würden am Ende immer absolute Pfade verwenden, wenn Sie PATH verwenden möchten, wodurch der Zweck von PATH zunichte gemacht wird.
Dies ist auch der Grund, warum es eine wirklich schlechte Idee ist, relative Pfade in Ihrem Pfad zu haben. Ich sehe dich annode_modules/bin
.
Nehmen wir umgekehrt an, dass Laufen:
./someprog
Würde suchen:
- relativ zu PATH zuerst
- relativ zu CWD nach
Wenn Sie dann gerade ein Skript someprog
aus einem Git-Repository heruntergeladen und von CWD ausführen möchten, wären Sie sich nie sicher, ob dies das eigentliche Programm ist, das ausgeführt wird, da Ihre Distribution möglicherweise Folgendes hat:
/bin/someprog
Das ist in dir PATH von einem Paket, das du installiert hast, nachdem du letztes Jahr nach Weihnachten zu viel getrunken hast.
Daher wären Sie erneut gezwungen, immer lokale Skripte relativ zu CWD mit vollständigen Pfaden auszuführen, um zu wissen, was Sie ausführen:
"$(pwd)/someprog"
das wäre auch extrem nervig.
Eine andere Regel, die Sie möglicherweise in Versuchung führen könnten, wäre:
Relative Pfade verwenden nur PATH, absolute Pfade nur CWD
Dies zwingt die Benutzer jedoch erneut dazu, für Nicht-PATH-Skripte mit immer absolute Pfade zu verwenden "$(pwd)/someprog"
.
Die /
Pfadsuchregel bietet eine einfach zu merkende Lösung für das About-Problem:
- Schrägstrich: nicht verwenden
PATH
- kein Schrägstrich: nur verwenden
PATH
Dies macht es sehr einfach, immer zu wissen, was Sie ausführen, indem Sie sich auf die Tatsache verlassen, dass Dateien im aktuellen Verzeichnis entweder als ./somefile
oder ausgedrückt werden können somefile
, und gibt daher einer von ihnen eine besondere Bedeutung.
Manchmal ist es etwas ärgerlich, dass Sie nicht some/prog
relativ zu suchen können PATH
, aber ich sehe keine vernünftigere Lösung dafür.