Come cerca Unix per i file eseguibili?

Quando un file viene eseguito, come cerca Unix? Se ci sono più file eseguibili in PATH con lo stesso nome, quale è preferibile? La directory corrente è inclusa nella ricerca quando viene eseguito un file?

Supponiamo che esista un file con nome executable.sh nella directory corrente. Sarebbe che funziona se viene eseguito $ executed e . non fa parte del PATH ?

Il $ PATH viene ricercato dall'inizio alla fine, con l'esecuzione del primo eseguibile corrispondente. Quindi le directory all'inizio di $ PATH hanno la precedenza su quelle che vengono in seguito. Gli eseguibili nella directory corrente (.) Vengono eseguiti solo se. è in $ PATH (che di solito non è ). Non esiste alcuna inclusione implicita della directory corrente nel path di ricerca.

Per i file nella directory corrente, si desidera precedere con ./ , quindi il command diventerà ./executable.sh . Non dovresti mai avere . nel tuo PATH in quanto costituisce un rischio per la sicurezza, tra gli altri problemi.

Elenchi che vengono prima nel PATH e hanno cercato prima.

L' ordine complessivo per la ricerca è così se ricordo bene:

  • alias

  • funzioni esportte

  • comandi di shell incorporati

  • script e binari nel tuo PATH

Anche se questo è stato risposto bene da altri, vorrei aggiungere alcuni pensieri:

1) PATH viene consultato solo se l'eseguibile invocato non ha elementi di path in esso. alcuni comandi sarebbero stati esaminati in $ PATH, ./somecommand o /usr/bin/somecommand , o ../../bin/somecommand solo utilizzare le regole della directory, non PATH

Se ci sono più file eseguibili in PATH con lo stesso nome che uno è preferito?

Si ferma al primo che trova, leggendo $ PATH da sinistra a destra.

La directory corrente è inclusa nella ricerca quando il file viene eseguito?

Se la directory corrente è in PATH allora viene ricercata. Ricorda che una directory vuota in PATH include la directory corrente. ad esempio PATH =: / usr / bin (conducente vuoto) PATH = / usr / bin: (trailing empty) e PATH = / usr / bin :: / bin (vuoto medio)

Supponiamo che esista un file con nome executable.sh in una directory corrente. Sarebbe che funziona se viene eseguito $ eseguito e. non fa parte del PATH?

Non lo troverebbe mai cercando PATH. Se il dir corrente non è in PATH, non lo troverà tramite una ricerca PATH.

Detto questo (e dispiace aggiungere confusione) se ci fosse un alias o una function che eseguiva il command, sarebbe stato eseguito. O se la shell ha avuto una cache di posizione e l'eseguibile era nella cache, potrebbe trovarlo. Quindi, non lo troverà mai in PATH, ma può essere gestito con altri mezzi.

Per vedere che cosa il tuo path attualmente è solo type echo $PATH , o printenv PATH .

Allora saprai l'ordine di ricerca. Se si dispone di più file con lo stesso nome, eseguire correttamente ____ per visualizzare.

Ex.

sistema #> che grep

/ Usr / bin / grep

un modo cool per trovare file che funzionano come il tuo objective è quello di utilizzare apropos:

apropos grep

bzgrep (1) – cerca eventualmente file bzip2 compressi per un'espressione regolare

egrep (1) – linee di printing corrispondenti a un pattern

fgrep (1) – linee di printing corrispondenti a un pattern

grep (1) – linee di printing corrispondenti a un pattern

e così via…