333 votes

Pourquoi devez-vous. / (point-barre oblique) avant le nom de script pour exécuter dans bash ?

Lors de l'exécution de scripts en bash, je dois écrire ./ le 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 est la raison? J'ai pensé . est un alias pour le dossier en cours, et par conséquent, ces deux appels doit être équivalent.

Aussi, je ne comprends pas pourquoi je n'ai pas besoin ./ lors de l'exécution d'applications, telles que:

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

(qui fonctionne sans ./)

344voto

cnicutar Points 98451

Parce que sur Unix, généralement, le répertoire courant n'est pas en $PATH.

Lorsque vous tapez une commande, le shell cherche une liste de répertoires, comme spécifié par l' PATH variable. Le répertoire courant n'est pas dans cette liste.

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

Disons que vous êtes root et aller dans un autre répertoire de l'utilisateur et du type sl au lieu de ls. Si le répertoire courant est en PATH, le shell va essayer d'exécuter l' sl programme dans ce répertoire (car il n'y a pas d'autre sl program). Qu' sl programme pourraient être malveillants.

MODIFIER

Qu' sl partie était juste un exemple. Les répertoires en PATH sont recherchés de façon séquentielle et quand un match est en fait que le programme est exécuté. Ainsi, en fonction de combien de PATH semble, en tapant une commande normale peut ou peut ne pas être suffisante pour exécuter le programme dans le répertoire courant.

56voto

neuro Points 6590

Lorsque bash interprète de la ligne de commande, il semble pour les commandes dans les emplacements décrits dans la variable $PATH. Pour voir ce type:

echo $PATH

Vous aurez un peu de chemins séparés par des virgules. Comme vous le verrez le chemin d'accès actuel . n'est généralement pas en $PATH. Si Bash ne trouvez pas votre commande si elle est dans le répertoire courant. Vous pouvez le changer en:

PATH=$PATH:.

Cette ligne ajoute le répertoire courant, en $PATH , de sorte que vous pouvez faire:

manage.py syncdb

C'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.

43voto

mdm Points 7651

Votre script, quand il est dans votre répertoire personnel ne sera pas jugée lorsque la coquille se penche sur le `` variable d’environnement pour trouver votre script.

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

5voto

Mark Drago Points 801

Lorsque vous incluez le". " vous êtes essentiellement en donnant le "chemin d'accès" à l'exécutable script bash, de sorte que votre shell n'a pas besoin de vérifier votre variable PATH. Sans le". " de votre shell va chercher dans votre variable PATH (que vous pouvez voir en exécutant echo $PATH pour voir si la commande que vous avez tapé vit dans l'un des dossiers sur votre CHEMIN. 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 en cours sur votre CHEMIN, ce qui s'explique assez bien ici: http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html

-1voto

Gayan L Points 186

Lorsque le script n’est pas dans le chemin de son besoin de le faire. Pour plus d’informations, lisez http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X