Pourquoi utilisons-nous “./” pour exécuter un fichier?

84

Pourquoi utilisons-nous ./filenamepour exécuter un fichier sous Linux?

Pourquoi ne pas simplement entrer comme d'autres commandes gcc, lsetc ...

Renjith G
la source
La première ligne ne serait-elle pas mieux écrite comme suit: "Pourquoi utilisons-nous ./command_namepour exécuter une commande sous Linux?"

Réponses:

78

Sous Linux, UNIX et les systèmes d'exploitation associés, .désigne le répertoire actuel. Puisque vous voulez exécuter un fichier dans votre répertoire actuel et que ce répertoire ne se trouve pas dans votre $PATH, vous avez besoin du ./bit pour indiquer au shell où se trouve l'exécutable. Donc, ./foosignifie exécuter le fichier exécutable appelé fooqui se trouve dans ce répertoire.

Vous pouvez utiliser typeou whichpour obtenir le chemin complet de toutes les commandes trouvées dans votre $PATH.

badp
la source
5
Il est très courant d'exécuter des programmes dans le répertoire en cours. Pourquoi le shell n'effectue-t-il pas également une recherche? Il cherche d'abord dans., Puis dans $ PATH.
Michael
il y a aussi des aliases qui peuvent gêner, pas seulement $PATH.
user2485710
18
@Michael security and sanity: Si la recherche a été effectuée en .premier, il s'agirait d'un problème de sécurité. Vous ou une autre personne pourriez lspar exemple le remplacer (un simple virus / trojen: créez un fichier zip avec un exécutable nommé ls, pendant que quelqu'un effectue une recherche. , ils exécutent cet exécutable, ça…). Si la recherche a été effectuée en .dernier, vous pouvez passer beaucoup de temps à devenir fou en ne sachant pas pourquoi votre programme ne fonctionne pas (par exemple, vous créez un programme appelé test, au lieu d'exécuter votre programme, il exécute le programme de test du système. Ce qui ne produit aucun résultat).
ctrl-alt-delor
Cela garantit également que si l'application ou le script apparaît plusieurs fois dans votre chemin, vous exécutez la version que vous souhaitez exécuter (celle qui se trouve ici dans votre répertoire ".").
Jim2B
Vous pouvez exécuter export PATH="$PATH:."pour exécuter une commande dans le répertoire en cours s’il n’est pas trouvé ailleurs dans PATH, vous pouvez l’ajouter dans votre fichier .bashrc
jcubic
99

La réponse littérale est la même que celle donnée par d’autres: parce que le répertoire actuel n’est pas dans votre $PATH.

Mais pourquoi En bref, c'est pour la sécurité. Si vous cherchez dans le répertoire personnel de quelqu'un (ou / tmp), et tapez juste gccou ls, vous voulez savoir que vous utilisez le vrai, pas une version malicieuse que votre ami farceur a écrite et qui efface tous vos fichiers. Un autre exemple serait testou [, qui pourrait remplacer ces commandes dans des scripts de shell, si votre shell n'en contient pas.

Avoir .comme dernière entrée sur votre chemin est un peu plus sûr, mais il y a d'autres attaques qui l'utilisent. Une solution simple consiste à exploiter les fautes de frappe courantes, comme slou ls-l. Vous pouvez également rechercher une commande commune qui n'est pas installée sur ce système vim, par exemple, car les administrateurs système ont une probabilité supérieure à la moyenne de la taper.

mattdm
la source
5
Un exemple pratique de quelqu'un qui se fait avoir par ça: unix.stackexchange.com/questions/7767
mattdm
Juste avoir des chemins absolus dans la PATHvariable d'environnement.
Ed Heal
45

Si vous voulez dire, pourquoi avez-vous besoin de ./ au début - c'est parce que (contrairement à Windows), le répertoire actuel ne fait pas partie de votre chemin par défaut. Si vous courez:

$ ls

votre shell cherche lsdans les répertoires de votre variable d'environnement PATH ( echo $PATHpour la voir) et exécute le premier exécutable appelé lsqu'il trouve. Si vous tapez:

$ a.out

le shell fera de même - mais il ne trouvera probablement pas d’exécutable appelé a.out. Vous devez dire au shell où se trouve a.out - si c'est dans le répertoire en cours (.) Puis le chemin est ./a.out.

Si vous demandez pourquoi il s'appelle "a.out", c'est simplement le nom du fichier de sortie par défaut pour gcc. Vous pouvez le changer avec l'argument de ligne de commande -o. Par exemple:

$ gcc test.c -o test
$ ./test
Simon Whitaker
la source
Merci. Mon doute est la raison pour laquelle vous avez besoin de ./ au début ... Je suis habitué à "." (pour le répertoire courant) mais pourquoi "/" après?
Renjith G
8
/ est le séparateur de chemin sous Linux, vous l'utilisez donc pour séparer le répertoire (.) du nom de fichier (a.out). Sans cela, vous avez .a.out, qui est un nom de fichier valide. (Essayez touch .a.out; ls -lAde voir ça.)
Simon Whitaker Le
5
c'est ainsi que vous spécifiez le chemin sous Unix, <dir>/<file>vous dites donc essentiellement exécuter un fichier dans le répertoire actuel, ce qui est indiqué par./test
Rohan Monga
La version 9 du noyau (Shrike) 2.4.20-8 de Red Hat Linux sur un i686 [renjithg @ cvsserver renjithg] $ touch. : 46 .a.out -rwxrwxr-x 1 renjithg renjithg 11669 30 nov 13:46 a.out -rw-rw-r-- 1 renjithg renjithg 218 24 août 2009 aray.c [renjithg @ cvsserver renjithg] $
Renjith G
3
Red Hat Linux 9? Temps de mise à niveau!
Mattdm
4

Vous pouvez essayer d’ajouter :.à votre variable $ PATH.

Essayez ALT + F2 et tapez: gksudo gedit /etc/environmentsi vous utilisez Linux / GTK (c'est ce que vous avez si vous utilisez Ubuntu).

Cependant, je vous déconseille vivement de le faire. C'est mauvais, mauvais, mauvais.

Vous savez, ce genre de choses fonctionne de la sorte depuis 1970. Il y a une raison pour laquelle le répertoire actuel n'est pas inclus dans le $ PATH.

. est le répertoire courant

.somethingserait un fichier caché (tapez "ALT +" pour les faire apparaître dans Nautilus, ou essayez " ls -la".

./someProgram.sh est ce que vous tapez pour exécuter un exécutable someProgram.sh dans le répertoire en cours.

.somethingElse signifierait que vous avez un exécutable caché dans le répertoire en cours, ce qui est une mauvaise idée.

TIC Tac
la source