web-dev-qa-db-fra.com

Bascule le format du terminal gnome Chaîne d'invite par commande?

Mon terminal a un format d’invite par défaut comme celui-ci:

nom d'utilisateur @ nom de la boîte/chemin/vers/courant/répertoire $

Le code qui le produit ressemble à ceci: (il a aussi des définitions de couleurs)

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

Si le chemin d'accès au répertoire en cours devient trop long, il devient désagréable de travailler avec le terminal car vous cassez constamment des lignes. Dans de tels cas, je préférerais un format produisant une chaîne plus courte comme celle-ci:

nom d'utilisateur @ nom de boîte nom_répertoire_actuel $

Le code qui le produit ressemble à ceci (encore une fois avec la couleur):

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

Est-ce que quelqu'un sait comment je pourrais facilement basculer le format de la fenêtre de terminal actuelle d'un style à l'autre en tapant par exemple: prompttoggle?

9
Rotareti

Stockez vos variables PS1 longues et courtes sous un nom différent:

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

Assurez-vous de définir initialement PS1 sur l'un d'entre eux:

PS1="$PS1long"

Vous pouvez ensuite créer un alias comme celui-ci pour basculer entre les deux valeurs PS1:

alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

Ajouter les quatre lignes à votre fichier ~/.bashrc aura comme conséquence la commande disponible dans vos sessions Bash, les voici à nouveau pour une copie plus facile:

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
PS1="$PS1long"
alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'
10
Byte Commander

Vous pouvez utiliser une petite fonction bash:

prompttoggle () { 
    if [[ $PS1 = *basename* ]]; then 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
    else 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
    fi ;}

La fonction ci-dessus correspond si le $PS1 actuel contient basename, si oui, alors le PS1 sans basename est défini, sinon celui avec basename est défini.

Mettez la fonction dans votre ~/.bashrc pour la rendre disponible dans toutes les sessions interactives.

Exemple:

foo@bar:~/spam/Egg$ prompttoggle () { 
>     if [[ $PS1 = *basename* ]]; then 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
>     else 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
>     fi ;}

foo@bar:~/spam/Egg$ prompttoggle 

foo@bar Egg $ prompttoggle

foo@bar ~/spam/Egg $
7
heemayl

Ou ... créez deux très petites fonctions et ajoutez-les à la fin de votre ~/.bashrc

# short Prompt
promptshort() { export PS1=$(echo "$PS1" | sed 's/\\w/\\W/g') ; }

# full length Prompt
promptlong() { export PS1=$(echo "$PS1" | sed 's/\\W/\\w/g') ; }

pour une invite raccourcie, tapez promptshort, pour revenir au chemin complet, tapez promptlong

\W affiche uniquement le répertoire de travail en cours pour que $(basename ${PWD}) soit overkill imho

Vous pouvez combiner une seule fonction mais "long" et "court" sont descriptifs et comportent moins de frappes au clavier que "bascule";)

Au lieu d'ajouter une ligne pour remplacer PS1, je préfère modifier le code qui le définit (par exemple, annulez le commentaire force_color_Prompt=yes et modifiez la ligne après [ "$color_Prompt" = yes ]; then).

5
Zanna

Voici une définition de fonction ~/.bashrc que j’utilise personnellement pour réinitialiser/basculer mon invite d’invite régulière à simplement $. Adaptez-le selon vos besoins.

resetps() {
    if [ "$PS1" = "$ " ] 
    then
        PS1=$OLDPS1 
    else
        OLDPS1=$PS1 
        export OLDPS1 
        PS1="$ " 
    fi 
} 
3

C’est une réponse à votre problème (de longs répertoires coupent la ligne de commande) et pas spécifiquement à votre question (comment changer l’invite de commande à la volée).

J'ai résolu ce problème il y a des années avec cette invite:

PS1='\[\e[32;1m\]$? \u@\h \[\e[35;1m\]\w\[\e[m\]\n\$ '
#    └──green───┘         └──purple──┘  └─norm─┘

Qu'est-ce que cela fait:

  1. affiche la valeur de sortie de la commande précédente (ce qui est extrêmement utile)
  2. sortir l'utilisateur actuel et l'hôte en une couleur
  3. affichez le répertoire de travail dans une autre couleur (ajustez les couleurs à votre goût)
  4. affiche le dollar et l'espace sur une nouvelle ligne , en terminant les séquences de couleur avant le saut de ligne

Cela vous donne tout l’espace dont vous avez besoin pour votre commande, ne le décale pas correctement lorsque vous êtes dans une structure de répertoire profonde, ne modifie pas la ligne de frappe avec des codes de couleur (évitant ainsi l’éventualité de bugs étranges) indice sur l'endroit où la sortie d'une commande s'est terminée et la suivante commencée:

enter image description here

1
Tobia