Perché usiamo "./" per eseguire un file?


84

Perché usiamo ./filenameper eseguire un file in Linux?

Perché non inserirlo semplicemente come altri comandi gcc, lsecc ...


La prima riga non sarebbe meglio scritta come "Perché usiamo ./command_nameper eseguire un comando in Linux?"

Risposte:


78

In Linux, UNIX e relativi sistemi operativi, .indica la directory corrente. Poiché si desidera eseguire un file nella directory corrente e tale directory non è nella propria $PATH, è necessario il ./bit per dire alla shell dove si trova l'eseguibile. Quindi, ./foosignifica eseguire l'eseguibile chiamato fooche si trova in questa directory.

Puoi usare typeo whichper ottenere il percorso completo di tutti i comandi trovati nel tuo $PATH.


5
È molto comune eseguire programmi nella directory corrente. Perché la shell non cerca anche lì? Prima cerca in., Poi in $ PERCORSO.
Michael,

ci sono anche aliases che possono interferire, non solo $PATH.
user2485710

18
@Michael security and sanity: se cercasse .prima, allora sarebbe un problema di sicurezza, tu o qualcun altro potresti sostituire lsper esempio (un semplice virus / trojen: crea un file zip con un eseguibile chiamato lsal suo interno, mentre qualcuno sta cercando attraverso , eseguono questo eseguibile, quello ...). Se lo .hai cercato per ultimo, puoi passare molto tempo impazzendo non sapendo perché il tuo programma non funziona (ad es. Fai un programma chiamato test, invece di eseguirlo esegue il programma di test dei sistemi. Che non produce output).
ctrl-alt-delor

Inoltre, assicura che se l'applicazione o lo script compaiono più volte nel percorso, si sta eseguendo la versione che si intende eseguire (quella proprio nella directory ".").
Jim2B

È possibile eseguire export PATH="$PATH:."per eseguire il comando nella directory corrente se non si trova altrove nel PERCORSO, è possibile aggiungerlo nel file .bashrc
jcubic,

99

La risposta letterale è come altri hanno dato: perché la directory corrente non è nella tua $PATH.

Ma perchè? In breve, è per la sicurezza. Se stai cercando nella directory home di qualcun altro (o / tmp) e digiti solo gcco ls, vuoi sapere che stai eseguendo quella vera, non una versione maligna che il tuo amico burlone ha scritto che cancella tutti i tuoi file. Un altro esempio potrebbe essere testo [, che potrebbe sovrascrivere quei comandi negli script di shell, se la shell non li ha come built-in.

Avere .l' ultima voce nel tuo percorso è un po 'più sicuro, ma ci sono altri attacchi che ne fanno uso. Uno facile è quello di sfruttare errori di battitura comuni, come slo ls-l. Oppure, trova un comando comune che sembra non essere installato su questo sistema vim, ad esempio poiché i amministratori di sistema hanno una probabilità superiore alla media per digitarlo.


5
Un esempio pratico di qualcuno che si sta mordendo
mattdm

Basta avere percorsi assoluti nella PATHvariabile d'ambiente.
Ed Heal,

45

Se vuoi dire, perché hai bisogno ./ All'inizio - questo perché (diversamente da Windows), la directory corrente non fa parte del tuo percorso per impostazione predefinita. Se corri:

$ ls

la tua shell cerca lsnelle directory nella tua variabile d'ambiente PATH ( echo $PATHper vederlo), ed esegue il primo eseguibile chiamato lsche trova. Se digiti:

$ a.out

la shell farà altrettanto, ma probabilmente non troverà un eseguibile chiamato a.out. Devi dire alla shell dove si trova a.out: è nella directory corrente (.) Quindi il percorso è ./a.out.

Se stai chiedendo perché si chiama "a.out", questo è solo il nome del file di output predefinito per gcc. Puoi cambiarlo con la riga di comando arg. Per esempio:

$ gcc test.c -o test
$ ./test

Grazie. Il mio dubbio è il motivo per cui hai bisogno ./ all'inizio .... Ho avuto l'uso di "." (per posizionare l'attuale directory) ma perché "/" dopo?
Renjith G,

8
/ è il separatore di percorso in Linux, quindi lo usi per separare la directory (.) dal nome del file (a.out). Senza di esso hai .a.out che è un nome file valido a sé stante. (Prova touch .a.out; ls -lAa vedere questo.)
Simon Whitaker,

5
questo è il modo in cui specifichi il percorso in Unix, <dir>/<file>quindi in pratica stai dicendo di eseguire un file nella directory corrente, che è indicato da./test
Rohan Monga,

Red Hat Linux versione 9 (Shrike) Kernel 2.4.20-8 su un i686 [renjithg @ cvsserver renjithg] $ touch .a.out; ls -lA total 3 -rw-rw-r-- 1 renjithg renjithg 0 nov 30 13 : 46 .a.out -rwxrwxr-x 1 renjithg renjithg 11669 30 nov 13: 13: a.out -rw-rw-r-- 1 renjithg renjithg 218 ago 24 ago 2009 aray.c [renjithg @ cvsserver renjithg] $
Renjith G

3
Red Hat Linux 9? È ora di aggiornare!
Mattdm,

4

Puoi provare ad aggiungere :.alla tua variabile $ PATH.

Prova ALT + F2 e digita: gksudo gedit /etc/environmentse esegui Linux / GTK (questo è quello che hai se usi Ubuntu).

TUTTAVIA, ti consiglio vivamente di NON farlo. È cattivo, cattivo, cattivo.

Sai, questo genere di cose funziona così dal 1970. C'è un motivo per cui la directory corrente non è inclusa in $ PATH.

. è la directory corrente

.somethingsarebbe un file nascosto (digitare "ALT +" per farli apparire in Nautilus o provare " ls -la".

./someProgram.sh è ciò che si digita per ESEGUIRE un eseguibile someProgram.sh nella directory corrente.

.somethingElse significherebbe che hai un eseguibile nascosto nella directory corrente, che è una cattiva idea.

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.