web-dev-qa-db-fra.com

"export PS1 =" pour la personnalisation de l'invite de shell

Je voulais personnaliser mon invite Shell pour inclure l'heure. Donc, j'ai export PS1='\t\w\$'.

Mon invite ressemble maintenant à 18:57:37~$. Je ne sais pas comment l'ajouter à username@hostname.

De plus, je ne sais pas comment changer la couleur de chaque paramètre pour \t, \w, etc.

Après tous les tests, comment puis-je le rétablir par défaut?

Enfin, où va la ligne d'exportation? J'ai regardé dans le ~/.profile, mais il n'y a pas la ligne export PS1='\t\w\$'.

2
Smile

PS1 est défini dans votre ~/.bashrc. Ce fichier contient les paramètres qui seront appliqués dans chaque shell interactif. Un shell interactif est ce que vous obtenez lorsque vous ouvrez un terminal dans Ubuntu, à moins que vous n'ayez défini un shell par défaut différent pour votre utilisateur.

Dans un shell interactif, nous avons besoin d'une invite, et c'est agréable si l'invite nous fournit des informations utiles, telles que le répertoire de travail actuel, l'utilisateur actuel et le nom d'hôte, comme le fait Ubuntu PS1.

Voici les lignes qui définissent PS1 dans la version par défaut de .bashrc pour mon système, /etc/skel/.bashrc

# uncomment for a colored Prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the Prompt
#force_color_Prompt=yes

if [ -n "$force_color_Prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_Prompt=yes
    else
        color_Prompt=
    fi
fi

if [ "$color_Prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_Prompt force_color_Prompt

De PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ', vous pouvez voir que les codes d'échappement de username et hostname sont respectivement \u et \h.

zanna@toaster:~$ PS1="\u@\h"
zanna@toaster

Si vous souhaitez ajouter l'heure et le répertoire de travail actuel:

zanna@toasterPS1="\u@\h \t \w "
zanna@toaster 10:43:32 ~ 

Pour obtenir des couleurs, vous devez utiliser les séquences d'échappement de couleurs. Vous pouvez en voir dans l'affectation color_Prompt dans .bashrc

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

Par exemple, \033[01;34m est en bleu:

PS1 assignment

Oops! Maintenant, le texte après est bleu aussi ... Mieux vaut le changer en blanc:

PS1 with color reassignment

Nous devrions entourer les assignations de couleurs de crochets, sinon Bash pensera qu’elles sont en train d’imprimer les caractères de l’invite et les utiliseront pour calculer sa taille. Cela donne des effets étranges lorsque vous essayez d'interagir avec votre historique, alors voici la version corrigée:

PS1="\[\033[01;34m\]\u@\h \t \w \[\033[00m\]"

Lorsque vous avez fini de jouer, vous pouvez rétablir l'invite par défaut en fermer le terminal et en ouvrir un nouvea ;) ou en exécutant

source ~/.bashrc

my PS1 back to normal

Je règle mon PS1 comme ceci en utilisant le code déjà présent dans .bashrc, décommentant #force_color_Prompt=yes et en modifiant les codes de couleur. Ici vous pouvez voir les lignes que j'ai changées pour le définir:

$ diff .bashrc /etc/skel/.bashrc 
46c46
< force_color_Prompt=yes
---
> #force_color_Prompt=yes
60c60
<     PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;35m\]\w\$\[\033[00m\] '
---
>     PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

(il y a plus de lignes modifiées après cela, mais elles ne sont pas pertinentes)

Vous pouvez faire la même chose, mais ajoutez un \t à la ligne color_Prompt quelque part, par exemple

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h \[033[01;36m\]\t \[\033[00m\]:\[\033[01;35m\]\w\$\[\033[00m\] '

Pour obtenir une liste des codes d'échappement ANSI pour les couleurs et d'autres éléments, voir ce guide de personnalisation de l'invite .


J'ai négligé de répondre à la dernière partie de votre question.

Enfin, où va la ligne d'exportation? J'ai regardé dans le ~/.profile, mais il n'y a pas la ligne d'exportation PS1='\t\w\$'

Je ne sais pas si vous pensiez que l'exécution de export VAR=val entraînerait la modification automatique de votre ~/.profile. La commande export ne le fait jamais. L'exportation d'une variable ne la passera que dans l'environnement des commandes exécutées à partir du shell actuel. Lorsque vous quittez le shell (et tous ses processus enfants sont terminés), tout ce que vous avez exporté à partir du shell est parti.

Si vous souhaitez définir une variable d'environnement de manière permanente, vous devez généralement l'ajouter explicitement à ~/.profile. Certains scripts que vous pourriez utiliser pour installer des logiciels peuvent modifier votre ~/.profile ou d'autres fichiers de configuration Shell.

Cependant, PS1 n'a pas besoin d'être exporté dans l'environnement. Au début de ma réponse, j’ai dit que dans un shell interactif, nous avions besoin d’une invite, et j’entendais que uniquement les shells interactifs ont besoin d’invites (car l’invite aide l’utilisateur interagit avec le shell). Aucune autre commande n'a besoin de PS1.

Vous pensez peut-être qu'il pourrait être utile que PS1 soit transmis à n'importe quel shell enfant du shell actuel. Lorsque vous démarrez un Shell interactif dans un Shell en exécutant bash, le nouveau Shell n'héritera pas des variables Shell du Shell appelant. seulement ses variables d'environnement. Donc, pour passer des variables à un shell enfant, nous devrions export les.

Cependant, l'exportation de PS1 échouera * généralement à transmettre sa valeur à un shell enfant, car elle est réinitialisée par les fichiers de configuration du shell, /etc/bash.bashrc et ~/.bashrc. Donc, la fermeture du terminal (comme je l’ai suggéré plus tôt) n’est pas nécessaire; Même si vous exécutez bash, votre invite retrouvera sa forme habituelle:

zanna@toaster:~$ export PS1='\t -> '
22:43:54 -> bash
zanna@toaster:~$ 

(Si vous exit ce shell, l'invite modifiée revient)

* Je dis habituellement, car, bien que les shells non interactifs soient toujours non définis PS1, un shell Bash interactif conservera la valeur de PS1 s'il est défini. Cela n’est pas évident car, comme le montre l’exemple précédent, il est généralement réinitialisé par les fichiers de configuration. Nous pouvons le découvrir en modifiant PS1 puis en démarrant un nouveau shell qui ne lit pas nos fichiers de configuration:

zanna@toaster:~$ export PS1='\t -> '
22:55:04 -> bash --norc
22:55:09 -> 

Donc, pour conclure, il n'y a pas de ligne export pour PS1 dans ~/.profile car PS1 n'est pas une variable d'environnement et n'a pas d'activité, car seuls les shells interactifs en ont besoin, et parce que les shells interactifs ont besoin de PS1, il est défini dans ~/.bashrc Parce que, sauf indication contraire, tous les shells interactifs Bash source~/.bashrc, donc ~/.bashrc n'a pas besoin de exportPS1 pour être hérités par des shells enfants (mais si vous voulez vraiment export une valeur de PS1 autre que celle de votre .bashrc Shell enfant, vous pouvez le faire en l’empêchant d’approvisionner .bashrc).


J'ai pu prolonger ma réponse grâce à Eliah Kagan, qui a expliqué comment Bash traite PS1 ici sur le chat et plus en détail dans cette réponse .

6
Zanna