Pourquoi avez-vous besoin./ (point-slash) avant le nom de l'exécutable ou du script pour l'exécuter en bash?

quand j'exécute des scripts dans bash, je dois écrire ./ au début:

$ ./manage.py syncdb

si Je ne le fais pas, je reçois un message d'erreur:

$ manage.py syncdb
-bash: manage.py: command not found

Quelle en est la raison? Je pensais que . était un alias pour le dossier courant, et donc ces deux appels devraient être équivalents.

Je ne comprends pas non plus pourquoi je n'ai pas besoin de ./ pour lancer des applications, telles que:

user:/home/user$ cd /usr/bin
user:/usr/bin$ git

(qui court sans ./ )

231
demandé sur Charles Duffy 2011-06-13 17:28:01

9 réponses

parce que sur Unix, habituellement, le répertoire courant n'est pas dans $PATH .

lorsque vous tapez une commande, l'interpréteur de commandes recherche une liste de répertoires, comme spécifié par la variable PATH . Le répertoire courant n'est pas dans cette liste.

la raison pour ne pas avoir le répertoire courant sur cette liste est la sécurité.

disons que vous êtes root et allez dans le répertoire d'un autre utilisateur et tapez sl au lieu de ls . Si le répertoire courant est dans PATH , le shell essaiera d'exécuter le programme sl dans ce répertoire (puisqu'il n'y a pas d'autre programme sl ). Ce programme sl pourrait être malveillant.

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

MODIFIER

cette partie de sl n'était qu'un exemple. Les répertoires de PATH font l'objet d'une recherche séquentielle et lorsqu'une correspondance est établie, le programme est exécuté. Ainsi, selon l'apparence de PATH , taper une commande normale peut être ou peut ne pas être suffisant pour exécuter le programme dans le répertoire courant.

245
répondu cnicutar 2016-10-30 17:29:59

quand bash interprète la ligne de commande, il recherche les commandes dans les emplacements décrits dans la variable d'environnement $PATH . Pour le voir taper:

echo $PATH

vous aurez quelques chemins séparés par des colons. Comme vous le verrez, le chemin actuel . n'est généralement pas dans $PATH . Donc Bash ne peut pas trouver votre commande si elle est dans le répertoire courant. Vous pouvez le changer en:

PATH=$PATH:.

cette ligne ajoute le courant répertoire dans $PATH ainsi vous pouvez faire:

manage.py syncdb

Il est pas recommandée, car elle a des problèmes de sécurité, plus vous pouvez avoir des comportements bizarres, comme . varie sur le répertoire que vous êtes :)

éviter:

PATH=.:$PATH

Comme vous pouvez le "masque" de certains de commande standard et ouvert la porte à une violation de la sécurité :)

juste mes deux cents.

44
répondu neuro 2016-07-11 16:36:52

votre script, lorsque dans votre répertoire personnel ne sera pas trouvé lorsque l'interpréteur de commandes regarde la variable d'environnement $PATH pour trouver votre script.

Le ./ dit " regarder dans le répertoire courant pour mon script plutôt que de regarder tous les répertoires spécifiés dans $PATH '.

31
répondu mdm 2011-06-13 13:29:52

si vous incluez le ".'vous donnez essentiellement le" chemin complet " vers le script de bash exécutable, de sorte que votre shell n'a pas besoin de vérifier votre variable de chemin. Sans le".'votre shell va regarder dans votre variable PATH (que vous pouvez voir en lançant echo $PATH pour voir si la commande que vous avez tapée vit dans l'un des dossiers de votre PATH. Si ce n'est pas (comme c'est le cas avec manage.py), il est dit qu'il ne peut pas trouver le fichier. Il est considéré comme une mauvaise pratique d'inclure le répertoire courant sur votre Chemin, qui est expliqué Raisonnablement Bien ici: http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html

4
répondu Mark Drago 2011-06-13 13:32:14

on *nix, contrairement à Windows, le répertoire courant n'est généralement pas dans votre variable $PATH . Ainsi, le répertoire courant n'est pas recherché lors de l'exécution des commandes. Vous n'avez pas besoin de ./ pour lancer des applications car ces applications sont dans votre $PATH; très probablement elles sont dans /bin ou /usr/bin .

1
répondu Anomie 2011-06-13 13:32:27

cette question a déjà des réponses géniales, mais je voulais ajouter que, si votre exécutable est sur le chemin, et que vous obtenez des sorties très différentes lorsque vous exécutez

./executable

à ceux que vous obtenez si vous exécutez

executable

(disons que vous rencontrez des messages d'erreur avec l'un et pas l'autre), alors le problème peut être que vous avez deux versions différentes de l'exécutable sur votre ordinateur: une sur le chemin, et l'autre pas.

vérifiez ceci en exécutant

qui exécutable

et

whereis executable

ça a réglé mes problèmes...J'ai eu trois versions de l'exécutable, dont une seule a été compilée correctement pour l'environnement.

1
répondu KR_Henninger 2016-10-20 14:18:50

lorsque le script n'est pas dans le chemin qu'il est tenu de faire. Pour plus d'informations lire http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html

0
répondu Gayan Hewa 2011-06-13 13:31:38

tout a une bonne réponse à la question, et oui cela ne s'applique que lorsque vous l'exécutez sur le répertoire courant, pas à moins que vous incluiez le chemin absolu. Voir mes exemples ci-dessous.

aussi, le (dot-slash) a eu du sens pour moi quand j'ai la commande sur le dossier enfant tmp2 (/tmp/tmp2) et il utilise (double dot-slash).

échantillon:

[fifiip-172-31-17-12 tmp]$ ./StackO.sh

Hello Stack Overflow

[fifi@ip-172-31-17-12 tmp]$ /tmp/StackO.sh

Hello Stack Overflow

[fifi@ip-172-31-17-12 tmp]$ mkdir tmp2

[fifi@ip-172-31-17-12 tmp]$ cd tmp2/

[fifi@ip-172-31-17-12 tmp2]$ ../StackO.sh

Hello Stack Overflow
-1
répondu FIFI 2018-09-28 13:58:09

il y a une différence entre Current Directory et Working Directory vous pourriez le trouver sur google facilement. C'est la raison pour laquelle votre din manage.py syncdb n'est pas exécuté comme prévu.

répertoire courant : c'est le répertoire à partir duquel votre processus shell ou parent est exécuté.

you are right "."  is for current directory.

dans le système UNIX si vous avez votre fichier à /data/myfile.out alors vous traversez à votre fichier à travers le composant Noms qui sont séparés par forward slash "/" donc si "." est votre répertoire courant alors si vous voulez accéder(exécuter dans votre cas) le fichier qui est à l'intérieur de votre répertoire courant vous devrez dire ./myexecutableFile.o . Si vous aviez votre fichier exécutable dans un autre dossier de votre répertoire courant, alors vous feriez quelque chose comme ceci ./myFiles/myexecutableFile.o . J'espère que vous avez ce que j'essaie d'expliquer.

-5
répondu Amandeep Jiddewar 2013-02-16 10:01:14