Comment fonctionne l'appel de commandes dans le shell
Non, ce n'est pas une commande. Le fonctionnement des shells est lorsque vous tapez une ligne de texte, le premier mot sera traité comme une commande, et si la commande ne fait pas partie de celles intégrées au shell, le shell regardera tous les emplacements répertoriés dans PATH
la variable d'environnement .
Que se passe-t-il si lorsque la commande que vous souhaitez exécuter se trouve dans le même répertoire que celui que vous avez actuellement localisé mais que ce répertoire ne figure pas dans la liste des PATH
répertoires? C'est à ce moment que vous devez utiliser ./
. C'est en quelque sorte exactement la même chose que de faire/bin/bash
- vous dites au shell où se trouve votre commande souhaitée, un chemin complet vers elle. Et en cas de ./ vous dites de shell "regardez dans ce répertoire". La partie si importante est que vous devez être dans le même répertoire où se trouve le fichier.
Bien sûr, pour exécuter réellement un exécutable, il doit avoir un bit exécutable défini, vous en aurez donc besoin chmod +x ./my_file
.
Donc, les étapes importantes:
cd
où vous avez enregistré le fichier; si c'est le cas ~/Downloads
,cd ~/Downloads
- Exécuter
chmod +x ./truecrypt-7.2-setup-x86
, cela dit "rendre le fichier truecrypt-7.2-setup-x86 qui est dans ce répertoire exécutable"
- Et maintenant
sudo ./truecrypt-7.2-setup-x86
Notez que l'utilisation de ./
n'est pas un comportement aléatoire, mais est en fait une norme, spécifiée par la norme Portable Operating System Interface (aka POSIX) , voir spécifiquement la section "Recherche et exécution de commandes".
Reproduire l'erreur
$ # 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
REMARQUE : le message d'erreur donné par sudo
est manifestement trompeur, c'est donc quelque chose à garder à l'esprit; Cependant, veuillez noter que ce n'était pas le cœur de la question que OP pose.
Documentation et références
Dans le bash
manuel 4.3, section "EXÉCUTION DE COMMANDE":
Si le nom n'est ni une fonction shell ni une fonction intégrée, et ne contient pas de barres obliques, bash recherche dans chaque élément du PATH un répertoire contenant un fichier exécutable de ce nom.
De Pourquoi avez-vous besoin de ./ (barre oblique) avant le nom du script pour l'exécuter dans bash? :
Il fonctionne avec ./ car POSIX spécifie qu'un nom de commande contenant un / sera utilisé directement comme nom de fichier, supprimant une recherche dans $ PATH. Vous auriez pu utiliser le chemin complet pour obtenir exactement le même effet, mais ./ est plus court et plus facile à écrire.
./
partie de la commande dit "Regardez dans le répertoire courant et exécutez la commande" truecrypt-7.2-setup-x86 "d'ici". Vous devez exécuter cette commande à partir du répertoire dans lequel vous avez décompressé le fichier.