./ (punto barra) è un comando?


16

Nucleo della domanda:

La domanda è nata mentre non riuscivo a installare il software, quindi sto veramente chiedendo. / Perché non lo sapevo e l'output "comando non trovato" mi stava confondendo su quale fosse effettivamente il comando.

Contesto:

Vorrei installare il file truecrypt-7.2-setup-x86.

Le istruzioni dicono di usare il comando:

sudo ./truecrypt-7.2-setup-x86

Ma l'output è:

sudo: ./truecrypt-7.2-setup-x86: command not found

AGGIORNAMENTO: per completezza, nel test ero nella cartella dei file ma non avevo ancora reso il file eseguibile (chmod + x).


1
La ./parte del comando dice "Cerca nella directory corrente ed esegui il comando 'truecrypt-7.2-setup-x86' da qui". È necessario eseguire questo comando dalla directory in cui è stato decompresso il file.
Charles Green,

2
@Videonauth - Non proprio, personalmente non penso che aumenti al livello di una risposta.
Charles Green,

1
@Zanna Ho testato uno script senza autorizzazioni di esecuzione e l'errore generato era un errore di autorizzazione mancante, non un comando non trovato.
Charles Green,

2
@ubuntubu OK, molto bene, ti sei spostato nella directory - bene. Piccolo commento sulla modifica, però. Il comando dovrebbe essere chmod +x, chmod -xè l'opposto - rimuove i permessi eseguibili
Sergiy Kolodyazhnyy,

4
Il titolo della domanda è abbastanza diverso dal corpo; forse questo dovrebbe essere risolto?
David Z,

Risposte:


24

./non è un comando. Il comando è ./truecrypt-7.2-setup-x86.

La shell e i programmi simili sudotratteranno un comando come un percorso quando contiene almeno un /carattere. Poiché .rappresenta la directory in cui ci si trova attualmente, ./truecrypt-7.2-setup-x86assegna un nome al file truecrypt-7.2-setup-x86nella directory corrente. Se non esiste un file del genere, oppure esiste ma non è possibile eseguire il file, verrà visualizzato un messaggio di errore.

Quando un comando non contiene una barra, $PATHvengono cercate le directory elencate in , come dice Sergiy Kolodyazhnyy . La directory corrente non è automaticamente cercato - ed è , non raccomanda di mettere .in $PATH. In questo modo, non esegui accidentalmente cose che non ti aspettavi di eseguire perché ti è capitato di avere cdd in una directory che le contiene.

Scrivere ./prima del nome di un eseguibile nella directory corrente il modo comune per eseguirlo, ma questa non è in realtà una sintassi speciale. Ad esempio, se hai incasinato il tuo $PATHe avevi bisogno di eseguire un comando simile ls, potresti scrivere /bin/ls. Non .è necessario in quel caso o in generale; ciò che serve è un punto /nel nome percorso per indicare che intendi che è un nome percorso.

Poiché .è sempre la directory corrente ed /è solo il separatore di directory, la prima cosa da fare è verificare che il file che hai nominato esista davvero nella directory corrente. (In tal caso, controlla le sue autorizzazioni , come spiega Charles Green . Ma se hai estratto il file da un archivio, di solito avrà già autorizzazioni eseguibili se è previsto che venga eseguito.)


21

La parte ./ del comando dice "Cerca nella directory corrente ed esegui il comando 'truecrypt-7.2-setup-x86' da qui". È necessario eseguire questo comando dalla directory in cui è stato decompresso il file.

Questo può essere testato: nella stessa finestra del terminale in cui si sta provando il comando, immettere il comando ls -l true*- se il file è presente nella directory di lavoro corrente, verrà visualizzato un elenco che mostra il file (e un mucchio di informazioni aggiuntive).

Come Zanna ha notato nei commenti, il tuo file potrebbe non avere i permessi di esecuzione - questo può essere risolto facilmente. Come caso di prova, la mia directory mostra

chick@dad:~/test$ ls -l
total 4
-rw-r--r-- 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$

e il file "rFullBack" elenca '-rw-' come mia autorizzazione, per leggere e scrivere il file. Posso eseguire il comando chmod +x rFullBacke l'elenco delle directory cambia in

chick@dad:~/test$ ls -l
total 4
-rwxr-xr-x 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$

Qui i miei permessi sono ora '-rwx', indicando che posso eseguire il file.


In breve, se il file esiste nella tua directory

eseguire il comando

chmod +x ./truecrypt-7.2-setup-x86

e poi il comando

sudo ./truecrypt-7.2-setup-x86

1
Non proprio. Elenca rw-come permesso - il -prima è per set [gu] id e bit appiccicosi.
Duncan X Simpson,

@DuncanXSimpson Grazie - Ho aggiornato un po 'la descrizione delle autorizzazioni, ma ho intenzione di ignorare il setguid e i bit appiccicosi per questa risposta!
Charles Green,

8

Come funzionano i comandi di chiamata nella shell

No, non è un comando. Il modo in cui funzionano le shell è quando si digita una riga di testo, la prima parola verrà trattata come comando e se il comando non è uno di quelli incorporati nella shell, la shell cercherà tutte le posizioni elencate inPATH variabile d'ambiente .

Cosa succede se quando il comando che si desidera eseguire si trova nella stessa directory in cui ci si trova attualmente ma quella directory non è nell'elenco delle PATHdirectory? Questo è quando è necessario utilizzare ./. È esattamente come fare /bin/bash- stai dicendo alla shell dove si trova il tuo comando desiderato, un percorso completo ad esso. E in caso di ./ stai dicendo di shell "cerca in questa directory". La parte così importante è che devi trovarti nella stessa directory in cui si trova il file.

Naturalmente, per poter effettivamente eseguire un eseguibile, deve essere impostato un bit eseguibile, quindi è necessario chmod +x ./my_file.

Quindi i passaggi importanti:

  1. cd dove hai salvato il file; se è dentro ~/Downloads, alloracd ~/Downloads
  2. Esegui chmod +x ./truecrypt-7.2-setup-x86, questo dice "make file truecrypt-7.2-setup-x86 che si trova in questo eseguibile il directory"
  3. E ora fallo sudo ./truecrypt-7.2-setup-x86

Si noti che l'uso di ./non è un comportamento casuale, ma in realtà è uno standard, specificato dallo standard Portable Operating System Interface (aka POSIX) , in particolare consultare la sezione "Ricerca ed esecuzione di comandi".

Riproduzione dell'errore

$ # my script is in ~/Downloads folder
$ stat -c "%n" /home/xieerqi/Downloads/my_script.sh                         
/home/xieerqi/Downloads/my_script.sh
$ # if I run sudo ./my_script.sh, we get an error
$ sudo ./my_script.sh
[sudo] password for xieerqi: 
sudo: ./my_script.sh: command not found
$ # of course the command not found because file is not in ./, not in this dir
$ # this is not  sudo's problem
$ # but sudo does indeed show the same error even if you're in same directory
$ cd ./Downloads/                                                                                                                                                      
$ sudo ./my_script.sh                                                                                                                                                  
[sudo] password for xieerqi: 
sudo: ./my_script.sh: command not found

NOTA : il messaggio di errore fornito da sudoè ovviamente fuorviante, quindi è qualcosa da tenere a mente; tuttavia, si noti che questo non era il nocciolo della domanda che OP sta ponendo.

Documentazione e riferimenti

Dal bashmanuale 4.3, sezione "ESECUZIONE DEI COMANDI":

Se il nome non è né una funzione shell né un builtin e non contiene barre, bash cerca in ogni elemento del PERCORSO una directory contenente un file eseguibile con quel nome.

Da Perché hai bisogno di ./ (punto-barra) prima del nome dello script per eseguirlo in bash? :

Funziona con ./ poiché POSIX specifica che un nome di comando che contiene un / verrà utilizzato direttamente come nome file, eliminando una ricerca in $ PATH. Avresti potuto usare il percorso completo per lo stesso identico effetto, ma ./ è più breve e più facile da scrivere.


In realtà l' sudooutput è fuorviante. Se si tenta lo stesso senza sudo, si otterrà un altro errore da bash: Permission denied. E giustamente, dal momento che non hai dato allo script il permesso di eseguire (tramite chmod +x).
Ruslan,

@Ruslan il fatto che l' sudooutput sia fuorviante è vero, ma questo è l'errore che si presenta. Potrebbe essere qualcosa da segnalare agli sviluppatori e lasciarli correggere. Tuttavia, questo non è il nocciolo della discussione: dovevamo stabilire cosa ha fatto l'OP per produrre tale errore e guidarli sulla strada giusta. Indipendentemente dal fatto che sia fuorviante, non è questo il problema.
Sergiy Kolodyazhnyy,

In un altro modo, non è esattamente uguale all'utilizzo /bin/bash: non ti consente di eseguire uno script su cui non hai i permessi di esecuzione. Quando si precedere il nome dello script con /bin/bash, il fatto che /bin/bashsia eseguibile è tutto ciò che conta, come si è il comando in esecuzione. Quando non lo fai, lo script stesso viene eseguito, il che a sua volta porta a #!invocare la tua shell corrente o qualsiasi cosa nella prima riga
Monty Harder,

@MontyHarder /bin/bashè solo un esempio qui. Il fatto che stiamo chiamando /bin/bashe ./script.sh specificando il percorso della cosa in esecuzione - è lo stesso. Prefacciare lo script con bash script.sho /bin/bash script.shè un argomento completamente diverso, in cui si esegue un eseguibile e gli si passa lo script come argomento, che può comunque rompersi se la sintassi è scritta per qualcosa di diverso dalla shell che si sta chiamando csh. /bin/bashè eseguibile, ma il fatto è che stai ancora specificando il percorso completo.
Sergiy Kolodyazhnyy,

2
@SergiyKolodyazhnyy Prefazione di un nome di script con /bin/basho anche solo bashè anche un modo comune per risolvere la mancanza di autorizzazioni eseguibili per lo script. Specificare il percorso completo dello script non risolve questo problema. Quindi /bin/bashè un esempio particolarmente negativo in questo caso specifico.
Monty Harder,
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.