web-dev-qa-db-fra.com

PATH = $ PATH: `pwd` - Que se passe-t-il lorsque cette commande est exécutée?

Que se passe-t-il lorsque cette commande est exécutée?

PATH =$PATH:`pwd`

Erreur: Rien ne se produit lorsque j'exécute la commande dans le terminal.

4
user831837

Si vous exécutez la commande dans votre question, vous devriez recevoir un message d'erreur:

$ PATH =$PATH:`pwd`
bash: PATH: command not found

Si l'espace est une faute de frappe, et que vous exécutez ceci:

PATH=$PATH:`pwd`

Ensuite, cela ajoutera le répertoire en cours (pwd est une commande qui affiche le chemin du répertoire en cours, et `pwd` sera remplacé par la sortie de pwd) à la variable PATH pour la durée de votre session Shell en cours (util vous fermez le terminal ). Pour illustrer:

$ pwd
/home/terdon/foo  ## I am in /home/terdon/foo

$ echo $PATH ## the current PATH
/home/terdon/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

$ PATH=$PATH:`pwd`
$ echo $PATH
/home/terdon/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/terdon/foo

Notez comment le répertoire en cours, /home/terdon/foo, a été ajouté à la fin de la variable PATH.

15
terdon

L'erreur

En ce qui concerne votre commande initiale, réponse de terdon couvre déjà très bien ce qui se passe et ce qui devrait se passer. Analysons cela légèrement plus en détail.

Ce que vous essayez de faire est une affectation de variable, qui devrait prendre la forme de:

varName=value

Cependant, à cause de l'espace, il s'agit d'une commande PATHavec un argument de ligne de commande consistant en un = puis le contenu de la variable $PATH et une substitution de commande de pwdname__, le tout étant associé à la même chaîne:

PATH =$PATH:`pwd`

Bien sûr, il n’existe pas de commande telle que PATHname__, vous aurez donc une erreur.

Shell traite les commandes simples et leurs arguments en tant que liste d'un ou de plusieurs jetons séparés par des espaces (avec éventuellement une affectation de variable optionnelle avant). En d'autres termes, le formulaire devrait être:

[VAR=value] Word [arg1 [arg2 [arg3] ]...]

Bien sûr, ce n'est pas ce qui est souhaité dans ce cas.

La commande appropriée

Donc, ce qui aurait dû être fait est le suivant:

PATH=$PATH:`pwd`    

Ici, nous avons une affectation de variable appropriée, où, conformément à l'ordre d'expansion , bashShell commence par développer les variables, c'est-à-dire, remplace $PATH par tout ce que vous avez dans cette variable, puis effectuez une substitution de commande à l'endroit où il s'exécute. pwdet le remplace par la sortie de pwdname__. En fin de compte, tout ce qui est attribué à la variable PATHname__.

Quelques observations clés:

  • Comme il s'agit d'une affectation de variable, vous n'avez pas besoin de citer la variable $PATH, mais vous devez généralement éviter tout comportement indésirable. Voir Quand un double devis est-il nécessaire
  • les substitutions de commandes sous forme de backticks sont non recommandé de nos jours . Dans ce cas particulier, c'est correct, mais en général, les backticks ne se prêtent pas bien aux commandes d'imbrication et multilignes.
  • La variable PATHest utilisée par Shell pour rechercher des commandes, et l'ordre des répertoires de cette liste définit la priorité selon laquelle les commandes seraient recherchées. Ainsi, par exemple, lorsque vous exécutez une commande, le shell vérifie d’abord si elle est intégrée ; dans le cas contraire, il examinera tous les répertoires de la variable PATHname__. La PATH=$PATH:$(pwd) ferait en sorte que Shell traverse tout le reste, et seulement ensuite accéder au répertoire fourni par pwdname__. Par contre, PATH=$(pwd):$PATH lancera la recherche à partir du répertoire renvoyé par pwdname__. Donc, l'ordre de la mission est important.
2