In che modo Unix cerca i file eseguibili?


47

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

Supponiamo che ci sia un file con nome executable.shnella directory corrente. Funzionerebbe se viene eseguito $ executede .non fa parte del PATH?


menzionando il which <executable>comando sarà utile in questo thread.
Ragioniere م

Risposte:


45

Il $ PATH viene cercato dall'inizio alla fine, con il primo eseguibile corrispondente in esecuzione. Quindi le directory all'inizio di $ PATH hanno la precedenza su quelle che verranno dopo. Gli eseguibili nella directory corrente (.) Vengono eseguiti solo se. è in $ PATH (che di solito non lo è ). Non vi è alcuna inclusione implicita della directory corrente nel percorso di ricerca.


È strano che il mio $ PATH non contenga ., ma sembra che cerchi prima dalla directory corrente, prima di controllare le directory definite in $ PATH stesso.
Eric Wang,

19

Per i file nella directory corrente, ti consigliamo di precederli ./, quindi il comando diventerebbe ./executable.sh. Non dovresti mai avere .nel tuo PERCORSO in quanto rappresenta un rischio per la sicurezza, tra gli altri problemi.

Elenchi che vengono per primi nel PERCORSO e cercati per primi.

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

  • alias

  • funzioni esportate

  • comandi di shell integrati

  • script e binari nel tuo PERCORSO


7
Aggiungo l'hash - ricordo bash (e forse altre shell) mantenere un hash di comandi usati di recente per facilitare la ricerca. A volte è necessario eliminare la cache (utilizzando hash -r) se si modifica il percorso o il percorso del programma.
Rich Homolka,

3
+1 per l'ordine di ricerca. Sarebbe bello se potessi ricordare la fonte di informazioni :)
twan163

8

Anche se alcuni hanno risposto bene, vorrei aggiungere alcuni pensieri:

1) PATH viene consultato solo se l'eseguibile richiamato non contiene elementi del percorso. un secondo posto sarebbe cercato in $ PATH, ./somecommando /usr/bin/somecommand, o ../../bin/somecommandsemplicemente usando le regole della directory, non PATH

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

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

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

Se la directory corrente è in PERCORSO, viene cercata. Ricorda che una directory vuota in PATH include la directory corrente. ad es. PATH =: / usr / bin (vuoto iniziale) PATH = / usr / bin: (vuoto finale) e PATH = / usr / bin :: / bin (vuoto medio) includeranno effettivamente la directory di lavoro corrente.

Supponiamo che ci sia un file con nome eseguibile.sh in una directory corrente. Funzionerebbe se viene eseguito $ eseguito e. non fa parte del PERCORSO?

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

Detto questo (e mi dispiace aggiungere confusione) se ci fosse un alias o una funzione che eseguiva il comando, sarebbe stato eseguito. O se la tua shell avesse una cache di posizione e l'eseguibile fosse nella cache, potrebbe trovarla. Quindi, non lo troverà mai nel PERCORSO, ma potrebbe essere gestito con altri mezzi.


Grazie per la cachenota, mi fa quasi impazzire il fatto che il vecchio eseguibile in /usr/bin/sia ancora invocato non quello nuovo /usr/local/bin, tuttavia è a sinistra nel $PATHriquadro fino a quando non ho effettuato il logout e ho effettuato nuovamente l'accesso.
Ragioniere م

1
@theaccountant in bash puoi fare 'hash -r' per cancellare la cache della shell
Rich Homolka,

4

Per vedere qual è attualmente il tuo percorso echo $PATH, digita o printenv PATH.

Quindi conoscerai l'ordine di ricerca. Se hai più file con lo stesso nome, esegui quale ____ visualizzare.

Ex.

system #> che grep

/ Usr / bin / grep

un modo interessante per trovare file che funzionano come il tuo obiettivo è usare a proposito:

a proposito di grep

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

egrep (1) - stampa le linee corrispondenti a un motivo

fgrep (1) - stampa le linee corrispondenti a un motivo

grep (1) - stampa le linee corrispondenti a un motivo

e così via...


2
Oh sì - ho dimenticato la funzione whereis per trovare TUTTE le istanze di un file:> whereis grep
mbb

grep: / bin / grep / usr / bin / grep /usr/share/man/man1/grep.1.gz
mbb

whereisutilizza un elenco di posizioni codificate, non $PATH.
Grawity,

@grawity Potresti approfondire su questo?
WinEunuuchs2Unix

-2

@ coneslayer- L'ordine predefinito di ricerca dell'eseguibile è il percorso corrente, i comandi integrati e quindi $ PATH. Quindi se una funzione denominata eseguibile esiste già nel pwd, allora viene eseguita. Se non la precedenza cerca i comandi incorporati della shell e quindi $ PATH


Se stavi parlando della conchiglia Thompson, della conchiglia Mashey o di qualche altro blocco fossilizzato di 40 anni fa, potresti avere ragione. Ma nessuna shell Unix corrente e corrente cerca automaticamente la directory corrente.
Scott,

@Scott Quindi il percorso di ricerca predefinito per un comando viene prima incorporato e poi $ PATH e cerca nel CWD solo se do ./? Ho ragione?
proc

Bene, alias, funzioni e builtin. Quindi, se si specifica un percorso con il comando (incluso ./), cerca solo quella directory; altrimenti, cerca $PATH.
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.