Pourquoi dois-je taper './' avant d'exécuter un programme dans le répertoire actuel?

87

Lors de l'exécution d'un programme C, a.out , à l'aide du terminal Ubuntu, pourquoi dois-je toujours taper ./ avant a.out , au lieu d'écrire a.out ? Y a-t-il une solution pour cela?

    
posée Prashant Chikhalkar 16.07.2013 - 13:58
la source

10 réponses

114

Lorsque vous tapez le nom d'un programme tel que a.out , le système recherche le fichier dans votre PATH. Sur mon système, PATH est défini sur

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

Le vôtre est probablement similaire. Pour vérifier, entrez echo $PATH dans un terminal.

Le système examine ces répertoires dans l'ordre indiqué et, s'il ne trouve pas, le programme génère une erreur command not found .

Le préfixe de la commande avec ./ indique effectivement "oubliez PATH, je veux que vous regardiez uniquement dans le répertoire en cours".

De même, vous pouvez demander au système de rechercher uniquement un autre emplacement spécifique en ajoutant à la commande un chemin relatif ou absolu, tel que:

../ signifie dans le répertoire parent, par exemple ../hello cherche hello dans le répertoire parent.

./Debug/hello : "recherchez hello dans le sous-répertoire Debug de mon répertoire actuel."

ou /bin/ls : "recherchez ls dans le répertoire /bin "

Par défaut, le répertoire en cours ne se trouve pas dans le chemin car il est considéré comme un risque de sécurité. Voir Pourquoi? pas dans le chemin par défaut? sur le superutilisateur pour pourquoi.

Il est possible d'ajouter le répertoire actuel à votre PATH, mais pour les raisons données dans la question liée, je ne le recommanderais pas.

    
réponse donnée Warren Hill 16.07.2013 - 15:20
la source
24

La raison en est simple.

Supposons que vous ayez une commande portant le même nom qu'une application dans le répertoire en cours. Ensuite, exécuter la commande dans le shell invoquerait votre application à la place de la commande intégrée. Ce serait un problème de sécurité si rien d’autre.

En exigeant que ./ soit utilisé devant, le shell sait que vous souhaitez exécuter l'application avec le nom indiqué et non avec une commande intégrée portant ce nom.

    
réponse donnée Nathan Osman 16.12.2010 - 04:21
la source
16

./ exécute les fichiers qui ne sont pas dans votre $PATH , mais exécute plutôt le fichier dans le répertoire en cours (ou un autre via ./home/stefano/script.sh ). Maintenant, PATH est une variable d’environnement qui contient tous les endroits où bash peut rechercher des programmes exécutables sans avoir le chemin complet (absolu).

Cette séparation est nécessaire pour éviter d’exécuter le mauvais fichier. C'est à dire. Si vous avez un fichier appelé ls dans votre répertoire personnel, le fait qu'il ne soit pas dans votre PATH empêchera bash de le confondre avec le vrai ls . La variable PATH définit également l’ordre de recherche:

  • Lorsque vous exécutez une commande ou qu'un programme essaie de lancer un exec syscall (une méthode spéciale du noyau, le mode de démarrage des programmes), le système recherche le fichier en parcourant chacun des répertoires de votre chemin PATH. . Une fois le programme trouvé, même s’il se trouve dans plusieurs annuaires, la recherche est interrompue et le premier trouvé est exécuté.

Pour exécuter un fichier, vous devez définir le bit exécutable dans les autorisations:

  • Puisque vous êtes déjà sur la ligne de commande, vous pouvez simplement taper chmod +x finename .

  • Vous pouvez également définir les autorisations en cliquant avec le bouton droit de la souris sur le fichier et en sélectionnant Propriétés :

Vous pouvez maintenant copier le fichier dans l'un des répertoires de PATH pour voir quels sont ceux-ci - et ils sont définis par utilisateur - tapez echo $PATH .

[email protected]:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Si vous créez un fichier exécutable, cat , et le déplacez vers /usr/local/sbin , il sera exécuté à la place du cat approprié, qui réside dans /bin . Vous pouvez trouver où sont vos fichiers en utilisant type cat et whereis cat .

    
réponse donnée Stefano Palazzo 16.12.2010 - 04:18
la source
11

Pourquoi faut-il taper ./ avant d’exécuter un programme?

Dans le terminal, chaque fois que vous tapez le nom d'une application, disons gedit , le terminal recherchera certains répertoires (prédéfinis) contenant des applications (les fichiers binaires des applications). Les noms de ces répertoires sont contenus dans une variable appelée PATH . Vous pouvez voir le contenu de cette variable en exécutant echo $PATH . Voir les répertoires séparés par : ? Ce sont les répertoires dans lesquels le terminal ira chercher, si vous tapez simplement gedit , nautilus ou a.out . Comme vous pouvez le constater, le chemin de votre programme a.out n’est pas là. Quand vous faites ./a.out , vous dites au terminal "regardez dans le répertoire actuel, exécutez a.out et ne regardez pas dans PATH .

Solution 1

Si vous ne voulez pas taper ./ à chaque fois, vous devez ajouter le répertoire de a.out dans $PATH . Dans les instructions suivantes, je supposerai que le chemin d'accès à a.out est /path/to/programs/ , mais vous devez le changer pour votre chemin d'accès réel.

  1. Ajoutez simplement la ligne suivante à la fin du fichier ~/.pam_environment :

    PATH DEFAULT=${PATH}:/path/to/programs
    

    Source: Variables d'environnement persistantes

  2. Déconnectez-vous et reconnectez-vous. Vous pourrez maintenant exécuter a.out sans ./ à partir de n'importe quel répertoire.

Si vous avez d'autres programmes dans d'autres répertoires, vous pouvez simplement les ajouter à la ligne ci-dessus. Cependant, je vous conseillerais par exemple de créer un répertoire appelé "mes programmes" et de placer tous vos programmes sous celui-ci.

Solution 2

Note: change userName to your actual Ubuntu username.

Et si vous avez d'autres programmes à exécuter? Et ils sont tous dans des dossiers différents? Eh bien, une solution "plus organisée" consisterait à créer un dossier appelé bin dans votre répertoire de départ et à ajouter des liens symboliques (raccourcis) dans ce dossier. Voici comment:

  1. mkdir /home/userName/bin

    • Ceci créera le dossier bin dans votre répertoire de base.
  2. ln -s /path/to/programs/a.out /home/userName/bin

    • Ceci créera un "lien symbolique" (en gros, un raccourci) de votre programme a.out sous bin .
  3. Déconnectez-vous et reconnectez-vous. Vous pourrez maintenant exécuter a.out sans ./ à partir de n'importe quel répertoire.

Maintenant, chaque fois que vous avez un autre programme ailleurs, disons le programme b.in sur votre bureau, tout ce que vous avez à faire est: ln -s /home/userName/Desktop/b.in /home/userName/bin , et vous pourrez ensuite l'exécuter sans ./ as bien.

Note: thanks to @Joe's comment, when you do backups, symbolic links have to be handled specially. By default, rsync doesn't process them at all, so when you restore, they're not there.

    
réponse donnée Alaa Ali 16.07.2013 - 15:27
la source
1

Comme George l'a souligné dans sa réponse, cela vous aide à noter que votre exécution d'un fichier du répertoire de travail actuel ( pwd ).

Je me souviens d’avoir posé cette question à mon aîné il y a longtemps, il a dit que je devrais ajouter . à mon chemin afin que, lorsque je le ferais a.out , il regarde dans le répertoire actuel et l’exécute. Dans ce cas, je n'ai pas à faire ./a.out .

Mais personnellement, je le déconseille. Cela ne m'est jamais arrivé, mais si vous êtes sur un répertoire de réseau extraterrestre ou quelque chose du genre et qu'un fichier exécutable malveillant appelé ls existe là-bas, alors avoir . dans votre chemin est une très mauvaise idée. Non pas que vous rencontriez ce problème très souvent, il vous suffit de dire.

    
réponse donnée Shrikant Sharat 16.12.2010 - 04:32
la source
0

Un './' prend tout son sens lorsque vous exécutez un programme connu et spécifique, par exemple. votre propre. Ce programme doit être présent dans votre répertoire actuel. Un './' n'a aucun sens lorsque vous exécutez une commande standard située quelque part dans $ PATH. Une commande "quelle commande exécuter" vous indique où se trouve la commande à exécuter dans $ PATH.

    
réponse donnée user7346 16.12.2010 - 12:06
la source
0
$ gcc hello.c -o /path/to/someplace/hello

produira un exécutable à un endroit donné. Si cet emplacement est sur votre chemin, vous pourrez exécuter le fichier. Vous pouvez créer un script si vous souhaitez créer un libellé pour l'action "compiler ce code source à l'aide du gcc et placer un exécutable à un emplacement situé sur votre chemin"

Je vous suggérerais de créer un nouveau répertoire appelé "testbin" ou quelque chose du genre et de le placer sur votre chemin pour garder propres vos répertoires de chemins existants.

    
réponse donnée Jon Kiparsky 16.07.2013 - 20:35
la source
0

./ élimine la recherche inutile d'un chemin. ./ force à rechercher uniquement dans le répertoire en cours. Si nous ne donnons pas ./ , il recherchera différents chemins définis dans le système, tels que /usr/bin , /usr/sbin/ , etc.

    
réponse donnée user175959 17.07.2013 - 13:11
la source
0

"./" signifie que vous voulez exécuter un fichier dans le répertoire courant, c'est un raccourci pour taper le chemin complet, par exemple:

[[email protected] ~]#/path/to/file/file.pl

est identique à:

[[email protected] file]#./file.pl

dans l'exemple précédent, vous avez parcouru le répertoire et ses sous-répertoires jusqu'à l'emplacement du fichier et utilisé "./" pour exécuter le fichier dans le répertoire actuel.

Celui qui le précède " [racine @ serveur ~] # / chemin / vers / fichier / fichier.pl " exécutera également le fichier si vous êtes paresseux pour "cd" accéder au fichier. emplacement.

    
réponse donnée Khaled Moustafa 25.04.2014 - 02:20
la source
-4

C’est très simple et a de nombreuses utilisations.

  1. Lorsque plusieurs versions de la même application sont installées, elles seront disponibles dans un chemin différent, mais un lien symbolique vers votre fichier binaire peut être créé dans /usr/bin . Par exemple, Python 2.7, Python 2.6 est installé mais / usr / bin / python - > python2.7 / usr / local / bin / python - > python2.6

Si vous êtes dans le chemin /usr/local/bin et exécutez Python, il exécutera toujours Python 2.7. Spécifier . prendra l'exécutable du dossier actuel.

  1. . - représente toujours l'exécution depuis le répertoire en cours. Et .. signifie toujours que s’exécute à partir du répertoire précédent.
réponse donnée Ramjee Anna 17.07.2013 - 11:12
la source

Lire d'autres questions sur les étiquettes