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 PATH
directory? 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:
cd
dove hai salvato il file; se è dentro ~/Downloads
, alloracd ~/Downloads
- 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"
- 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 bash
manuale 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.
./
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.