Que sont «$ PATH» et «~ / bin»? Comment puis-je avoir des scripts personnels?

29

Qu'est-ce que c'est $PATH?

Comment puis-je avoir des commandes / programmes qui ne sont disponibles que pour moi?
J'ai déjà vu ce chemin ~/bin, mais à quoi sert-il et comment l'utiliser?

Braiam
la source
J'expérimente un peu parce que c'est plus une FAQ ou du matériel wiki qu'une "vraie question". Il a été invité parce que j'ai mentionné ~ / bin dans une réponse précédente (dans la barre latérale liée à droite) et quelqu'un a commenté l'ajouter à PATH: maintenant au lieu de brefs commentaires, nous pouvons créer un lien vers ce message lorsque ~ / bin est mentionné.

Réponses:

26

$ PATH est une variable d'environnement utilisée pour rechercher des commandes. Le ~ est votre répertoire personnel, donc ~ / bin sera / home / user / bin; c'est un répertoire normal.

Lorsque vous exécutez "ls" dans un shell, par exemple, vous exécutez en fait le programme / bin / ls; l'emplacement exact peut différer selon la configuration de votre système. Cela se produit car / bin est dans votre $ PATH.

Pour voir le chemin et trouver où se trouve une commande particulière:

$ echo $PATH
/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:...
$ which ls     # searches $PATH for an executable named "ls"
/bin/ls
$ ls           # runs /bin/ls
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...
$ /bin/ls      # can also run directly
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...

Pour avoir votre propre répertoire bin privé, il vous suffit de l'ajouter au chemin. Pour ce faire, modifiez ~ / .profile (un fichier masqué) pour inclure les lignes ci-dessous. Si les lignes sont commentées, il suffit de les décommenter; s'ils sont déjà là, vous êtes prêt!

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ]; then
  PATH="$HOME/bin:$PATH"
fi

Vous devez maintenant créer votre répertoire ~ / bin et, comme .profile est exécuté à la connexion et n'ajoute ~ / bin que s'il existe à ce moment, vous devez vous reconnecter pour voir le CHEMIN mis à jour.

Testons-le:

$ ln -s $(which ls) ~/bin/my-ls   # symlink
$ which my-ls
/home/user/bin/my-ls
$ my-ls -l ~/bin/my-ls
lrwxrwxrwx 1 user user 7 2010-10-27 18:56 my-ls -> /bin/ls
$ my-ls          # lookup through $PATH
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...
$ ~/bin/my-ls    # doesn't use $PATH to lookup
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...

la source
3
Une chose à surveiller lors de l'utilisation, c'est qu'il ne trouvera que les commandes qui sont des binaires dans le système de fichiers, il ne signale pas les commandes internes, les alias ou les fonctions du shell. Souvent, il est plus utile d'utiliser typepour voir comment une commande réelle sera résolue par le shell; par exemple: which echoet type echorapportera différentes choses, whichretourne '/ bin / echo' mais 'type' renvoie que c'est un shell intégré, que le shell préférera au fichier dans '/ bin'.
Steve Beattie
@Steve Beattie, +1. whichest mieux remplacé par typeou commanddans des shells interactifs, et il est complètement inutile dans les scripts.
geirha
Une chose à noter que je viens de remarquer - $HOMEvariable in $PATHpour une raison quelconque ne fonctionne pas, c'est-à-dire qu'il faut utiliser ~signe à la place.
Hi-Angel
19

Concernant ~/binet commandes / programmes disponibles uniquement pour votre utilisateur

Les versions récentes d'Ubuntu incluent le ~/binrépertoire dans votre $PATH, mais seulement si le ~/binrépertoire existe.

S'il n'existe pas:

  1. Assurez-vous que votre ~/.profilecontient la strophe suivante (la valeur par défaut le fait ~/.profiledéjà):

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    
  2. Créez le ~/binrépertoire:

    mkdir -p ~/bin
    
  3. Redémarrez votre ordinateur ou forcez bash à relire ~/.profile:

    exec -l bash
    
Danilo Piazzalunga
la source
Merci pour le "redémarrage ou exec -l bash" astuce. Que fait le -ldrapeau? Je ne trouve pas d'explication dans man exec.
evanrmurphy
3
exec -lexécutera bash en tant que shell de connexion [ wiki.bash-hackers.org/commands/builtin/exec] . En bref, cela oblige bash à relire /etc/profileet ~/.profile. Une simple exécution exec bashne fera que relire ~/.bashrc.
Danilo Piazzalunga