Is ./ (punto barra) un comando?

16

Nucleo della domanda:

La domanda è nata mentre non riuscivo a installare il software, quindi mi chiedo sinceramente ./ perché non lo sapevo e l'output "command not found" mi confondeva su cosa 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

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

    
posta ubuntubu 27.10.2017 - 14:56

3 risposte

24

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

La tua shell e programmi come sudo tratteranno un comando come un nome percorso quando contiene almeno un% carattere% di carattere. Poiché / rappresenta la directory corrente in cui ci si trova, . assegna al file ./truecrypt-7.2-setup-x86 nella directory corrente. Se il file non esiste o se il file non può essere eseguito, verrà visualizzato un messaggio di errore.

Quando un comando non contiene una barra, le ricerche elencate in truecrypt-7.2-setup-x86 vengono ricercate , come Sergiy Kolodyazhnyy dice . La directory corrente non viene ricercata automaticamente ed è non consigliato per inserire $PATH in . . In questo modo, non esegui accidentalmente cose che non ti aspetti di eseguire perché ti è capitato di avere $PATH d in una directory che li contiene.

Scrivendo cd prima del nome di un eseguibile nella directory corrente il modo comune per eseguirlo, ma questo non è in realtà una sintassi speciale. Ad esempio, se hai incasinato ./ e hai dovuto eseguire un comando come $PATH , potresti scrivere ls . No /bin/ls è necessario in tal caso o in generale; ciò che è necessario è un . da qualche parte nel percorso per significare che si tratta di un percorso.

Poiché / è sempre la directory corrente e . è solo il separatore di directory, la prima cosa da fare è controllare che il file che hai nominato esista realmente nella directory corrente. (Se lo fa, controlla le sue autorizzazioni , come spiega Charles Green . Ma se hai estratto il file da un archivio, allora di solito avrà già le autorizzazioni eseguibili se è destinato a essere eseguito.)

    
risposta data Eliah Kagan 27.10.2017 - 16:15
21

La parte ./ del comando dice "Guarda 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 di terminale in cui stai provando il comando, inserisci il comando ls -l true* - se il file è presente nella directory di lavoro corrente, quindi un elenco che mostra il file (e un gruppo di ulteriori informazioni).

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

[email protected]:~/test$ ls -l
total 4
-rw-r--r-- 1 chick chick 788 Oct 27 06:15 rFullBack
[email protected]:~/test$

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

[email protected]:~/test$ ls -l
total 4
-rwxr-xr-x 1 chick chick 788 Oct 27 06:15 rFullBack
[email protected]:~/test$

Le mie autorizzazioni ora sono '-rwx', a indicare che posso eseguire il file.

In breve, se il file esiste nella directory

esegui il comando

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

e poi il comando

sudo ./truecrypt-7.2-setup-x86
    
risposta data Charles Green 27.10.2017 - 15:24
8

Come funzionano i comandi di chiamata nella shell

No, non è un comando. Il modo in cui le shell funzionano è 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 guarderà tutte le posizioni elencate in PATH variabile d'ambiente.

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

Naturalmente, per poter eseguire un eseguibile, è necessario che sia impostato il bit eseguibile, quindi dovrai chmod +x ./my_file .

Quindi i passi importanti:

  1. cd dove hai salvato il file; se è in ~/Downloads , quindi cd ~/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 di directory"
  3. E ora fa sudo ./truecrypt-7.2-setup-x86

Nota che l'uso di ./ non è un comportamento casuale, ma in realtà è uno standard, specificato da Standard di interfaccia del sistema operativo portatile (noto anche come POSIX) , in particolare consultare la sezione "Ricerca ed esecuzione dei 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 dato da sudo è ovviamente fuorviante quindi questo è qualcosa da tenere a mente; tuttavia, tieni presente che questo non era il nucleo della domanda che l'OP sta chiedendo.

Documentazione e riferimenti

Da bash 4.3 manuale, sezione "ESECUZIONE comando":

  

Se il nome non è né una funzione di shell né un builtin e non contiene alcuna barra, bash cerca ogni elemento del PATH per una directory contenente un file eseguibile con quel nome.

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

  

Funziona con ./ perché POSIX specifica che un nome di comando che contiene un / sarà usato direttamente come nome file, sopprimendo una ricerca in $ PATH. Potresti aver usato il percorso completo per lo stesso identico effetto, ma ./ è più breve e più facile da scrivere.

    
risposta data Sergiy Kolodyazhnyy 27.10.2017 - 15:35