Pourquoi lorsque j'entre cette commande, l'invite change dans mon répertoire?
PS1='$(pwd)'
J'utilise des guillemets simples, ce qui signifie pas d'interpolation, alias echo '$(pwd)'
—— →$(pwd)
En outre, disons que nous avons clarifié pourquoi cela fonctionne ... pourquoi cela fonctionne-t-il différemment de PS1=$(pwd)
? (pas de guillemets du tout)
Par différent, je veux dire que si j'utilise les guillemets, l'invite continuera de changer dans mon répertoire actuel pendant que je navigue dans le terminal. Mais si je n'utilise pas de guillemets, l'invite restera toujours le répertoire dans lequel j'étais lorsque j'ai entré la commande pour la première fois.PS1=$(pwd)
Pourquoi?
Réponses:
Lorsque vous affectez simplement une valeur à une variable, l'
$(...)
expression est évaluée sauf si elle est placée entre guillemets simples (ou avec barre oblique inversée). Pour comprendre, essayez de comparer ces deux:La valeur de
A
devient immédiatement la chaîne/home/yourusername
et, évidemment, on ne se souvient pas d'où vient cette chaîne, elle reste la même même si vous changez de répertoire.B
Cependant, la valeur de devient la chaîne littérale$(pwd)
sans être interprétée.Maintenant, la valeur de
PS1
quelque chose de spécial se produit: chaque fois que l'invite est imprimée, certaines constructions spéciales sont interprétées, par exemple la substitution de commande$(...)
est effectuée exactement comme elle s'est produite ci-dessus lors de l'affectation à laA
variable. Évidemment, si votrePS1
contient la chaîne littérale de votre répertoire personnel (comme ci-dessus avecA
), il n'y a aucun moyen que cela puisse changer. Mais s'il contient la chaîne$(pwd)
(comme ci-dessus avecB
), il est évalué chaque fois que l'invite est imprimée et donc votre répertoire réel est affiché.la source
Dans bash et zsh, la valeur de
PS1
n'est pas utilisée comme invite telle quelle, elle subit quelques extensions. Les règles diffèrent pour les deux coquilles, mais dans les deux cas, l' une des étapes consiste à effectuer l' expansion du « dollar » (substitution variables, les substitutions de commandes, évaluation arithmétique) avec la même syntaxe que dans la syntaxe shell normale ( , , ou , , ) .$VARIABLE
${VARIABLE}
$(COMMAND)
`COMMAND`
$((EXPRESSION))
$[EXPRESSION]
shopt -u promptvars
.setopt prompt_subst
.Lorsque l'expansion du dollar dans l'invite est activée,
PS1='$(pwd)'
définit la valeurPS1
à 6 caractères$(pwd)
et entraîne$(pwd)
donc la substitution, et donc lapwd
commande à exécuter, chaque fois que le shell affiche une nouvelle invite. D'un autre côté,PS1=$(pwd)
définitPS1
quel que soit le répertoire de travail actuel du shell à l'époque. Si l'expansion du dollar était désactivéePS1='$(pwd)'
, l'invite serait la chaîne littérale$(pwd)
.Notez qu'il existe des moyens plus pratiques d'obtenir le répertoire de travail à l'invite:
\w
, qui abrège votre répertoire personnel~
et peut être tronquée en définissantPROMPT_DIRTRIM
.%/
ou%~
(%/
est le même que$PWD
,%~
abrège les répertoires personnels), qui peut avoir un paramètre de découpage.$PWD
est équivalent à$(pwd)
: vous n'avez pas besoin d'exécuter un sous-processus pour obtenir le répertoire de travail courant.la source
Parce que sans les guillemets, le $ (pwd) est évalué lorsque PS1 est défini. Avec les guillemets, l'évaluation de $ (pwd) est reportée jusqu'à ce que l'invite s'affiche.
Sans les guillemets, PS1 est défini sur le répertoire en cours au moment où PS1 est défini. Avec les guillemets simples, PS1 est défini sur $ (pwd), ce qui signifie qu'il évaluera et imprimera le répertoire actuel chaque fois que l'invite est affichée.
la source