Pourquoi la définition de l'invite bash (PS1) entraîne-t-elle manuellement que root a un $ au lieu d'un #?


11

Je suis sur CentOS 6.4. Par défaut, l'invite de l'utilisateur root a un #symbole, c'est-à-dire qu'il ressemble à quelque chose [root@myserver ~]# .

echo $PS1imprime [\u@\h \W]\$; mais si je le fais PS1="[\u@\h \W]\$"(qui ne devrait pas changer quoi que ce soit, afaics), je finis avec une invite qui ressemble à ceci: [root@myserver ~]$.

Pourquoi quand j'essaye de le régler moi-même (j'aimerais finalement le changer en quelque chose de plus utile), interprète-t-il $littéralement? Presque toutes les pages que je peux trouver (par exemple, Comment: changer / configurer l'invite personnalisée bash (PS1) ) indiquent que cela \$devrait entraîner un #pour l'utilisateur root.


PS1=[\u@\h \W]\$retourne -bash: W]$: command not found.
choroba

@choroba oups, désolé, j'ai raté les guillemets doubles, ça aurait dû l'être PS1="[\u@\h \W]\$".
stripybadger

Réponses:


14

Dans votre question, vous indiquez que vous ne citez pas du tout la ligne; c'est clairement faux, car alors l'espace séparerait l'affectation d'argument "PS1 = [\ u @ \ h" de la commande "\ W] \ $". Veuillez vous rendre compte que chaque personnage est important.

Quoi qu'il en soit, ce que vous faites probablement est d'utiliser des guillemets doubles (") plutôt que des guillemets simples ('). Ils se comportent très différemment en ce qui concerne le shell interprétant ce que vous avez tapé. Avec des guillemets doubles, il essaiera de faire des choses intelligentes avec les séquences de barre oblique inverse / certains caractères. Pour cette affectation, étant donné qu'il n'y a rien de spécial à propos de \ u, \ h et \ W, ils ne sont pas modifiés; les crochets peuvent avoir des significations spéciales à divers endroits, mais pas dans ce cas, ils sont donc également laissés en place, mais comme a $a une variété de significations, toutes spéciales, la \$séquence est interprétée comme "ignorer la particularité du signe dollar, et la laisser là", et cette séquence est remplacée par un signe de dollar unique sans autre analyse. Le résultat de tout cela est attribué àPS1, et puisqu'il y a un signe dollar littéral, et non la \$séquence magique lorsque le shell construit l'invite réelle, vous obtenez simplement le signe dollar, et non le caractère dépendant de l'utilisateur effectif. L'analyse réelle est un peu plus compliquée, mais c'est l'essentiel pour cet exemple particulier.

Ce que vous avez tapé: PS1="[\u@\h \W]\$ "
Ce que le shell a attribué: PS1 <- "[\u@\h \W]$ "
Ce que vous vouliez: PS1 <- "[\u@\h \W]\$ "
Ce que vous devez taper:PS1='[\u@\h \W]\$ '

Ce que vous devez faire ensuite: lisez quelque chose comme ce didacticiel pour en savoir plus sur les citations du shell.


1
Oui, vous étiez sur place, j'utilisais des guillemets doubles (désolé de les avoir manqués dans la question d'origine), merci d'avoir signalé mon erreur.
stripybadger

Si jamais vous avez besoin d'utiliser des guillemets doubles pour une raison quelconque, l' utilisation PS1="...\\\$"de veiller à ce que la paire littérale \$est stockée dans PS1la coquille pour interpréter plus tard.
chepner

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.