Razionale per la /
regola POSIX PERCORSO
La regola è stata citata in: Perché hai bisogno di ./ (punto-barra) prima dell'eseguibile o del nome dello script per eseguirlo in bash? ma vorrei spiegare perché penso che sia un buon design in modo più dettagliato.
Innanzitutto, una versione esplicita della regola è:
- se il percorso contiene
/
(ad esempio ./someprog
, /bin/someprog
, ./bin/someprog
): CWD è usato e PATH non è
- se il percorso non contiene
/
(ad es. someprog
): viene utilizzato PATH e CWD no
Supponiamo ora che in esecuzione:
someprog
cercherebbe:
- relativamente alla CWD prima
- rispetto al PERCORSO dopo
Quindi, se volevi scappare /bin/someprog
dalla tua distribuzione, e hai fatto:
someprog
a volte funzionerebbe, ma altri fallirebbe, perché potresti trovarti in una directory che contiene un altro someprog
programma non correlato .
Pertanto, impareresti presto che questo non è affidabile e finiresti per usare sempre percorsi assoluti quando vuoi usare PATH, sconfiggendo quindi lo scopo di PATH.
Questo è anche il motivo per cui avere percorsi relativi nel tuo PERCORSO è una pessima idea. Sto guardando a voi,node_modules/bin
.
Al contrario, supponiamo che in esecuzione:
./someprog
Cerca:
- prima rispetto al PERCORSO
- rispetto a CWD dopo
Quindi, se hai appena scaricato uno script someprog
da un repository git e volessi eseguirlo da CWD, non saresti mai sicuro che questo sia il vero programma che verrebbe eseguito, perché forse la tua distribuzione ha un:
/bin/someprog
che è in te PERCORSO da un pacchetto che hai installato dopo aver bevuto troppo dopo Natale l'anno scorso.
Pertanto, ancora una volta, saresti costretto a eseguire sempre script locali relativi a CWD con percorsi completi per sapere cosa stai eseguendo:
"$(pwd)/someprog"
che sarebbe anche estremamente fastidioso.
Un'altra regola che potresti essere tentato di inventare sarebbe:
i percorsi relativi usano solo PATH, i percorsi assoluti solo CWD
ma ancora una volta questo costringe gli utenti a usare sempre percorsi assoluti per script non PATH con "$(pwd)/someprog"
.
La /
regola di ricerca del percorso offre una soluzione semplice da ricordare al problema about:
- barra: non usare
PATH
- nessuna barra: utilizzare solo
PATH
il che rende super facile sapere sempre cosa stai eseguendo, basandosi sul fatto che i file nella directory corrente possono essere espressi come ./somefile
o somefile
, e quindi dà un significato speciale a uno di essi.
A volte, è leggermente fastidioso non poter cercare in some/prog
relazione a PATH
, ma non vedo una soluzione più sana a questo.