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/someprogdalla tua distribuzione, e hai fatto:
someprog
a volte funzionerebbe, ma altri fallirebbe, perché potresti trovarti in una directory che contiene un altro someprogprogramma 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 someprogda 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 ./somefileo somefile, e quindi dà un significato speciale a uno di essi.
A volte, è leggermente fastidioso non poter cercare in some/progrelazione a PATH, ma non vedo una soluzione più sana a questo.