web-dev-qa-db-fra.com

Est-ce que ./ (barre oblique) est une commande?

Noyau de la question:

La question a été posée alors que je ne pouvais pas installer le logiciel. Je pose donc véritablement la question à propos de ./ car je ne le connaissais pas et la sortie "command not found" me confondait avec le sens réel de la commande.

Le contexte:

J'aimerais installer le fichier truecrypt-7.2-setup-x86.

Les instructions disent d'utiliser la commande:

Sudo ./truecrypt-7.2-setup-x86

Mais le résultat est:

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

UPDATE: pour être complet, dans le test, j'étais dans le dossier mais je n'avais pas encore rendu le fichier exécutable (chmod + x).

15
ubuntubu

./ n'est pas une commande. La commande est ./truecrypt-7.2-setup-x86.

Votre shell et des programmes tels que Sudotraiteront une commande comme un chemin quand il contient au moins un caractère /. Puisque . représente le répertoire dans lequel vous vous trouvez, ./truecrypt-7.2-setup-x86 nomme le fichier truecrypt-7.2-setup-x86 dans le répertoire en cours. S'il n'existe aucun fichier de ce type ou s'il ne peut pas être exécuté, vous obtiendrez un message d'erreur.

Quand une commande ne contient pas de barre oblique, les répertoires listés dans $PATH sont recherchés, comme , dit Sergiy Kolodyazhnyy . Le répertoire en cours n'est pas recherché automatiquement - et il est pas recommandé de mettre . dans $PATH. De cette façon, vous n'exécutez pas accidentellement des tâches que vous ne pensiez pas exécuter, car vous aviez cdname__d dans un répertoire qui les contient.

Écrire ./ avant le nom d’un exécutable dans le répertoire en cours méthode courante pour l’exécuter, mais il ne s’agit pas d’une syntaxe particulière. Par exemple, si vous avez gâché votre $PATH et que vous deviez exécuter une commande telle que lsname__, vous pouvez écrire /bin/ls. . n'est pas nécessaire dans ce cas ou en général; Ce qu'il faut, c'est un / quelque part dans le chemin pour indiquer que vous voulez dire que c'est un chemin.

Puisque . est toujours le répertoire actuel et que / est juste le séparateur de répertoires, la première chose à faire est de vérifier que le fichier que vous avez nommé existe vraiment dans le répertoire en cours. (Si c'est le cas, vérifiez alors permissions , car , explique Charles Green . Mais si vous extrait le fichier d’une archive, puis il a généralement déjà des droits d’exécution, s’il est destiné à être exécuté.)

24
Eliah Kagan

La partie ./ de la commande dit "Regardez dans le répertoire actuel et exécutez la commande 'truecrypt-7.2-setup-x86' à partir d'ici". Vous devez exécuter cette commande à partir du répertoire où vous avez décompressé le fichier.

Cela peut être testé: Dans la même fenêtre du terminal où vous essayez la commande, entrez la commande ls -l true* - si le fichier est présent dans le répertoire de travail en cours, une liste indiquant le fichier (et une foule d'informations supplémentaires) sera affichée. .

Comme Zanna l’a noté dans les commentaires, il est possible que votre fichier ne dispose pas des autorisations d’exécution - ce problème peut être facilement résolu. En tant que test, mon répertoire montre

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

et le fichier "rFullBack" indique "-rw-" comme autorisation, pour lire et écrire le fichier. Je peux exécuter la commande chmod +x rFullBack et le répertoire répertoriant les modifications apportées à

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

Là, mes permissions sont maintenant '-rwx', ce qui indique que je peux exécuter le fichier.


En bref, si le fichier existe dans votre répertoire

lancer la commande

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

et puis la commande

Sudo ./truecrypt-7.2-setup-x86
21
Charles Green

Comment fonctionne l'appel de commandes dans Shell

Non, ce n'est pas une commande. La manière dont les coquilles fonctionnent est la suivante: lorsque vous tapez une ligne de texte, Word est d'abord traité comme une commande. Si la commande ne fait pas partie des commandes intégrées au shell, ce dernier examinera tous les emplacements répertoriés dans l'environnement PATHname__. variable.

Que se passe-t-il si la commande que vous souhaitez exécuter se trouve dans le même répertoire que celui où vous vous trouvez actuellement mais que ce répertoire ne figure pas dans la liste des répertoires PATHname__? C'est à ce moment-là que vous devez utiliser ./. C'est exactement la même chose que de faire /bin/bash - vous dites au shell où se trouve votre commande souhaitée, ainsi que son chemin complet. Et dans le cas de ./ vous dites à Shell "regardez dans ce répertoire". Une partie si importante est que vous devez être dans le même répertoire que le fichier.

Bien sûr, pour exécuter un exécutable, il faut que le bit d’exécutable soit défini, vous aurez donc besoin de chmod +x ./my_file.

Donc, les étapes importantes:

  1. cd où vous avez enregistré le fichier; si c'est dans ~/Downloads, alors cd ~/Downloads
  2. Exécutez chmod +x ./truecrypt-7.2-setup-x86, ceci indique "make le fichier truecrypt-7.2-setup-x86 qui est dans ce répertoire exécutable"
  3. Et maintenant, Sudo ./truecrypt-7.2-setup-x86

Notez que l'utilisation de ./ n'est pas un comportement aléatoire, mais bien une norme, spécifiée par norme d'interface de système d'exploitation portable (aka POSIX) , voir plus précisément 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

NOTE: le message d'erreur donné par Sudoest évidemment trompeur, c'est donc un élément à garder à l'esprit; Cependant, veuillez noter que ceci n'était pas le cœur de la question posée par OP.

Documentation et références

Du manuel bash4.3, section "COMMAND EXECUTION":

Si le nom n'est ni une fonction Shell ni une commande intégrée, et ne contient pas de barre oblique, bash recherche dans chaque élément de PATH un répertoire contenant un fichier exécutable portant ce nom.

De Pourquoi avez-vous besoin de ./ (barre oblique) avant le nom du script pour l'exécuter en bash? :

Cela fonctionne avec ./ car POSIX spécifie qu'un nom de commande contenant un/sera utilisé directement comme nom de fichier, en supprimant une recherche dans $ PATH. Vous auriez pu utiliser le chemin complet pour le même effet, mais ./ est plus court et plus facile à écrire.

8