Perché devo digitare "./" prima di eseguire un programma nella directory corrente?

87

Durante l'esecuzione di un programma C, a.out , usando il terminale Ubuntu, perché devo sempre digitare ./ prima di a.out , invece di scrivere a.out ? C'è una soluzione per questo?

    
posta Prashant Chikhalkar 16.07.2013 - 13:58

10 risposte

114

Quando digiti il nome di un programma come a.out il sistema cerca il file nel tuo PERCORSO. Sul mio sistema, PATH è impostato su

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

Il tuo è probabilmente simile. Per verificare, inserisci echo $PATH in un terminale.

Il sistema guarda attraverso queste directory nell'ordine indicato e se non riesce a trovare il programma produce un errore command not found .

Prepending il comando con ./ dice in modo efficace "dimentica il PATH, voglio che tu guardi solo nella directory corrente".

Allo stesso modo puoi dire al sistema di cercare solo in un'altra posizione specifica anteponendo il comando con un percorso relativo o assoluto come:

../ significa nella directory padre ad esempio ../hello cerca hello nella directory padre.

./Debug/hello : "cerca hello nella sottodirectory Debug della mia directory corrente."

o /bin/ls : "cerca ls nella directory /bin "

Per impostazione predefinita, la directory corrente non si trova nel percorso perché è considerata un rischio per la sicurezza. Vedi Perché lo è. non nel percorso di default? su Superuser per il motivo.

È possibile aggiungere la directory corrente al PATH, ma per i motivi indicati nella domanda collegata, non la consiglierei.

    
risposta data Warren Hill 16.07.2013 - 15:20
24

Il motivo è semplice.

Supponiamo di avere un comando con lo stesso nome di un'applicazione nella directory corrente. Quindi eseguire il comando nella shell invocherà la tua app invece del comando integrato. Questo sarebbe un problema di sicurezza se non altro.

Richiedendo ./ da utilizzare in primo piano, la shell sa che vuoi eseguire l'applicazione con il nome specificato e non un comando predefinito con quel nome.

    
risposta data Nathan Osman 16.12.2010 - 04:21
16

./ esegue file che non sono nella tua $PATH , piuttosto esegue il file nella directory corrente (o un'altra tramite ./home/stefano/script.sh ). Ora, PATH è una variabile di ambiente che contiene tutti i punti in cui bash può cercare programmi eseguibili, senza avere il percorso completo (assoluto).

Questa separazione è necessaria per evitare di eseguire il file sbagliato. Cioè se hai un file chiamato ls nella tua home directory, il fatto di non essere nel tuo PATH impedirà a bash di confonderla con il% reale di% co_de. La variabile PATH definisce anche l'ordine di ricerca:

  • Quando si esegue un comando o un programma tenta di creare un ls syscall (un metodo speciale del kernel, come vengono avviati i programmi), il sistema cerca il file passando attraverso ciascuna delle directory nel PATH . Una volta che il programma è stato trovato, anche se è in più directory, la ricerca viene interrotta e viene eseguito il primo trovato.

Per eseguire un file, devi impostare il bit eseguibile nelle autorizzazioni:

  • Dato che sei già sulla riga di comando, puoi semplicemente digitare exec .

  • Oppure puoi impostare le autorizzazioni facendo clic con il pulsante destro del mouse sul file e selezionando Proprietà :

Ora puoi copiare il file in una delle directory in PATH, per vedere quali sono in là - e sono impostati su base per utente - digita chmod +x finename .

[email protected]:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Se crei un file eseguibile, echo $PATH e lo sposti in cat , viene eseguito al posto del /usr/local/sbin corretto, che risiede in cat . Puoi scoprire dove si trovano i tuoi file utilizzando /bin e type cat .

    
risposta data Stefano Palazzo 16.12.2010 - 04:18
11

Perché è necessario digitare ./ prima di eseguire un programma?

Nel terminale, ogni volta che si digita il nome di un'applicazione, diciamo gedit , il terminale andrà a cercare in alcune directory (predefinite) contenenti applicazioni (i file binari delle applicazioni). I nomi di queste directory sono contenuti in una variabile chiamata PATH . Puoi vedere cosa c'è in questa variabile eseguendo echo $PATH . Vedi quelle directory separate da : ? Quelle sono le directory in cui il terminale andrà a cercare, se digiti solo gedit , nautilus o a.out . Come puoi vedere, il percorso del tuo programma a.out non è lì. Quando fai ./a.out , stai dicendo al terminale "guarda nella directory corrente ed esegui a.out , e non andare a cercare in PATH .

Soluzione 1

Se non vuoi digitare ./ ogni volta, dovrai aggiungere la directory a.out in $PATH . Nelle seguenti istruzioni, presumo che il percorso a a.out sia /path/to/programs/ , ma dovresti modificarlo sul tuo percorso attuale.

  1. Aggiungi semplicemente la seguente riga alla fine del file ~/.pam_environment :

    PATH DEFAULT=${PATH}:/path/to/programs
    

    Origine: Variabili di ambiente persistenti

  2. Esci e accedi di nuovo. Ora puoi eseguire a.out senza ./ da qualsiasi directory.

Se hai altri programmi in altre directory, puoi semplicemente aggiungerli alla riga sopra. Tuttavia, consiglierei di avere una directory chiamata "myPrograms", ad esempio, e mettere tutti i programmi sotto di essa.

Soluzione 2

% Bl0ck_qu0te%

Che cosa succede se hai altri programmi che vuoi eseguire? E sono tutti in cartelle diverse? Bene, una soluzione "più organizzata" sarebbe quella di creare una cartella chiamata bin nella directory Home e aggiungere collegamenti simbolici (collegamenti) sotto quella cartella. Ecco come:

  1. mkdir /home/userName/bin

    • Questo creerà la cartella bin nella tua directory Home.
  2. ln -s /path/to/programs/a.out /home/userName/bin

    • Questo creerà un "link simbolico" (in pratica, una scorciatoia) del tuo programma a.out in bin .
  3. Esci e accedi di nuovo. Ora puoi eseguire a.out senza ./ da qualsiasi directory.

Ora, ogni volta che hai un altro programma in qualsiasi altro luogo, supponiamo che il programma b.in sul desktop, tutto ciò che devi fare è: ln -s /home/userName/Desktop/b.in /home/userName/bin , e potrai quindi eseguirlo senza ./ come bene.

% Bl0ck_qu0te%     
risposta data Alaa Ali 16.07.2013 - 15:27
1

Come ha sottolineato George nella sua risposta, questo ti aiuta a notare che il tuo esecuzione di un file nella directory di lavoro corrente ( pwd ).

Ricordo di aver fatto questa domanda al mio senior molto tempo fa, ha detto che dovrei aggiungere . al mio percorso in modo che quando faccio a.out esso guardi nella directory corrente e lo esegua. In questo caso non devo fare ./a.out .

Ma, personalmente, raccomanderei di non farlo. Non è mai successo a me, ma se sei su una directory di rete aliena o qualcosa del genere, e lì esiste un file eseguibile dannoso chiamato ls , quindi avere . nel tuo percorso è una pessima idea. Non che ti imbatti in questo problema molto spesso, solo dicendo.

    
risposta data Shrikant Sharat 16.12.2010 - 04:32
0

Un './' ha senso quando si esegue un programma che è noto per te e specifico, ad es. il tuo. Questo programma deve essere presente nella tua directory attuale. Un './' non ha senso quando si esegue un comando standard che si trova da qualche parte nel $ PATH. Un comando "which command-to-run" ti dice dove il comando da eseguire è in $ PATH.

    
risposta data user7346 16.12.2010 - 12:06
0
$ gcc hello.c -o /path/to/someplace/hello

produrrà un eseguibile in qualche luogo. Se quella posizione è sul tuo percorso, sarai in grado di eseguire il file. Puoi scrivere questo script se ti piace creare un'etichetta per l'azione "compila questo codice sorgente usando gcc e posiziona un eseguibile in un percorso che si trova sul tuo percorso"

Ti suggerisco di creare una nuova directory chiamata "testbin" o qualcosa del genere e metterla sul tuo percorso per mantenere pulite le directory dei percorsi esistenti.

    
risposta data Jon Kiparsky 16.07.2013 - 20:35
0

./ elimina la ricerca non necessaria di un percorso. ./ forza per cercare solo nella directory corrente. Se non forniamo ./ , cercherà vari set di percorsi nel sistema come /usr/bin , /usr/sbin/ , ecc.

    
risposta data user175959 17.07.2013 - 13:11
0

"./" significa che vuoi eseguire un file nella directory corrente è una scorciatoia per digitare l'intero percorso, ad esempio:

[[email protected] ~]#/path/to/file/file.pl

è uguale a:

[[email protected] file]#./file.pl

nell'esempio precedente hai passato la directory e le sue sup-directory nel percorso del file e usato "./" per eseguire il file nella directory corrente.

quello precedente " [root @ server ~] # / path / to / file / file.pl " eseguirà anche il file se si è pigri a "cd" verso il file posizione.

    
risposta data Khaled Moustafa 25.04.2014 - 02:20
-4

È molto semplice e ha molti usi.

  1. Quando sono installate più versioni della stessa applicazione, sarà disponibile in un percorso diverso, ma in /usr/bin può essere creato un collegamento software al tuo binario. Ad esempio, Python 2.7, Python 2.6 è installato ma / usr / bin / python - & gt; python2.7 / usr / local / bin / python - & gt; python2.6

Se ti trovi nel percorso /usr/local/bin ed esegui Python eseguirà sempre Python 2.7. Specificando . si prenderà l'eseguibile della cartella corrente.

  1. . - rappresenta sempre l'esecuzione dalla directory corrente. E .. indica sempre esecuzioni dalla directory precedente.
risposta data Ramjee Anna 17.07.2013 - 11:12

Leggi altre domande sui tag