Basculer le format de la chaîne d'invite du terminal gnome par commande?


9

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

username @ boxname / path / to / current / directory $

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 courant devient trop long, il devient désagréable de travailler avec le terminal car vous coupez constamment les lignes. Dans de tels cas, je préférerais un format qui produit une chaîne plus courte comme celle-ci:

username @ boxname current_dir_name $

Le code qui le produit ressemblerait à 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 simplement par exemple prompttoggle:?



@steeldriver pas jusqu'à présent. Basculer entre PROMPT_DIRTRIM=0et PROMPT_DIRTRIM=1semble plus simple que de basculer entre différentes valeurs pour PS1et le résultat est presque le même. Merci pour l'info!
Rotareti

L'utilisation de l' PROMPT_DIRTRIMun pourrait également ajouter des arguments à la commande. Si vous ne passez aucun argument, vous basculez entre PROMPT_DIRTRIM=0et PROMPT_DIRTRIM=1et si vous passez un nombre comme argument, vous le définissez PROMPT_DIRTRIM. promptlenserait alors un nom plus approprié pour la commande.
Rotareti

Réponses:


10

Stockez vos PS1variables 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 l' PS1un d'eux initialement:

PS1="$PS1long"

Ensuite, vous pouvez 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'

L'ajout des quatre lignes à votre ~/.bashrcfichier entraînera 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'

7

Vous pouvez utiliser une minuscule bashfonction:

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 courant $PS1contient basename, si oui, alors le PS1sans basenameest défini, sinon celui avec basenameest défini.

Mettez la fonction dans votre ~/.bashrcpour 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 $

5

Ou ... créez deux très petites fonctions et ajoutez à 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, tapezpromptlong

\Wmontre le répertoire de travail courant uniquement $(basename ${PWD})est surpuissant IMHO

Vous pouvez combiner en une seule fonction mais "long" et "short" sont descriptifs et les deux ont moins de touches que "toggle";)

Au lieu d'ajouter une ligne pour remplacer PS1, je préfère modifier le code qui le définit (par exemple, décommenter force_color_prompt=yeset modifier la ligne après [ "$color_prompt" = yes ]; then)


3

Voici une ~/.bashrcdéfinition de fonction que j'utilise personnellement pour réinitialiser / basculer mon invite de l'invite régulière à juste $. Adaptez-le selon vos besoins.

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

1

Ceci est une réponse à votre problème (les longs répertoires cassent la ligne de commande) et non 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─┘

Ce que cela fait:

  1. afficher la valeur de sortie de la commande précédente (c'est incroyablement utile)
  2. afficher l'utilisateur et l'hôte actuels dans une seule couleur
  3. sortie du répertoire de travail dans une autre couleur (ajustez les couleurs à votre goût)
  4. afficher le dollar et l'espace sur une nouvelle ligne , mettant fin aux séquences de couleurs avant la rupture de ligne

Cela vous donne tout l'espace dont vous avez besoin pour votre commande, ne la déplace 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 les bugs étranges qui se produisent parfois), tout en vous donnant la couleur indice sur la fin de la sortie d'une commande et sur la suivante:

entrez la description de l'image ici

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.