pourquoi ./ est nécessaire pour exécuter un fichier exécutable?

9

J'utilise ubuntu et je remarque que beaucoup de mes scripts exécutables ne s'exécuteront que si je précède le thème par ./.

Par exemple, si j'ai un script perl: /home/me/script.plet que je suis actuellement /home/me, taper script.plne le fera pas, mais le ./script.plfera.

Pourquoi donc?

David B
la source
B @ David: runnable file => executable file?
Lazer

Réponses:

13

Pour exécuter un script, vous devez saisir le chemin d'accès complet au script, sauf si le script est présent dans l'un des répertoires répertoriés dans votre $PATHvariable d'environnement. Généralement (et par défaut) .(le répertoire courant) n'est pas dans votre $PATH, vous devez donc taper ./scriptpour l'exécuter.

mipadi
la source
21

Parce que le répertoire actuel n'est pas dans votre chemin. Ceci est un élément de sécurité. S'il se trouvait sur votre chemin, quelqu'un pourrait potentiellement supprimer une copie malveillante d'une commande courante, et lorsque vous êtes dans ce répertoire au lieu d'exécuter le vrai sudo, par exemple, vous exécutez le faux. Ce serait une mauvaise chose.

Matt Greer
la source
3
C'est quelque peu trompeur. Tant qu'il y en .avait après /usr/bin/, cela ne remplacerait pas le réel sudo. Il s'agit de s'assurer que vous n'ajoutez pas accidentellement des programmes à votre chemin, mais il ne s'agit pas principalement de remplacer les programmes existants.
Matthew Flaschen du
Au lieu de sudo, j'utiliserais lset rm. Beaucoup plus susceptibles d'être appelés.
Aaron Digulla
@aaron: bien sûr mais lsne vous demandera pas votre mot de passe et si l'utilisateur peut utiliser sudole mot de passe c'est intéressant ...;)
laurent
1
@Matthieu. Oui, c'est toujours difficile à exploiter mais un vrai risque pour la sécurité. Disons que je mets dans un script slqui fait de mauvaises choses, puis invoque ls, puis se supprime. Vous ne pouvez pas remplacer les outils système, mais vous pouvez «typosquat»
Rich Homolka
@laurent: Ce que j'avais à l' esprit était: cp /bin/bash /tmp/sfhsdh ; chmod u+s tmp/sfhsdh >& /dev/null ; $0 "$@". Pas besoin de connaître le mot de passe.
Aaron Digulla
4
echo $PATH

Vous devez avoir le répertoire courant (un seul point) dans votre chemin pour que cela fonctionne.

Vous pouvez l'ajouter à votre chemin si vous le souhaitez avec les commandes suivantes.

sh / bash: export PATH=$PATH:.

tcsh / csh: set PATH = ($PATH .)


la source
3

le shell recherche le chemin des exécutables et, par défaut, ./ne se trouve pas dans le chemin.

Emyr
la source