Quelles sont les invites shell informatives et utiles? (Bash, csh, ksh, etc.)

8

L'un de mes conseils préférés sur le terminal Mac OS X consiste à ajouter le dernier processus en cours d'exécution dans le titre du terminal à l'aide du code suivant dans votre .bashrc .

trap 'printf "\033]0;  `history 1 | cut -b8-`  \007"' DEBUG

Maintenant, je cherche à personnaliser mon invite Bash par défaut en quelque chose de plus fonctionnel. Quels sont quelques exemples utiles d'invite du shell?

Dave K
la source

Réponses:

6

J'utilise un simple deux lignes:

[\w]\n\u@\h>

ou

[\w]\n\u@\h#

si root. Les gens me regardent comme si j'étais fou d'utiliser une invite à deux lignes, mais je déteste ne voir que la dernière partie du chemin actuel, et je travaille avec des chemins trop longs pour mettre le tout sur la même ligne que le zone de saisie.

le chaos
la source
Je dois donc être fou de fou pour utiliser une invite de 3 lignes, lol.
Ivan
7

J'ai un script ~/bin/setpromptexécuté par my .bashrc, qui contient:

RESET="\[\017\]"
NORMAL="\[\033[0m\]"
RED="\[\033[31;1m\]"
YELLOW="\[\033[33;1m\]"
WHITE="\[\033[37;1m\]"
SMILEY="${WHITE}:)${NORMAL}"
FROWNY="${RED}:(${NORMAL}"
SELECT="if [ \$? = 0 ]; then echo \"${SMILEY}\"; else echo \"${FROWNY}\"; fi"

# Throw it all together 
PS1="${RESET}${YELLOW}\h${NORMAL} \`${SELECT}\` ${YELLOW}>${NORMAL} "

Ce script définit l'invite sur le nom d'hôte suivi par :)si la dernière commande a réussi et :(si la dernière commande a échoué.

Eddie
la source
4

Cependant, c'est le plus génial que j'aie jamais vu:

PS1='\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[0;28m\]Managing \033[1;31m\]\j\[\033[0m\]\[\033[1;30m\]/\[\033[0m\]\[\033[1;31m\]$(ps ax | wc -l | tr -d '\'' '\'')\[\033[0m\]\[\033[1;30m\] \[\033[0m\]\[\033[0;28m\]jobs.\[\033[0m\]\[\033[1;30m\]] [\[\033[0m\]\[\033[0;28m\]CPU Load: \[\033[0m\]\[\033[1;31m\]$(temp=$(cat /proc/loadavg) && echo ${temp%% *}) \[\033[0m\]\[\033[0;28m\]Uptime: \[\033[0m\]\[\033[1;31m\]$(temp=$(cat /proc/uptime) && upSec=${temp%%.*} ; let secs=$((${upSec}%60)) ; let mins=$((${upSec}/60%60)) ; let hours=$((${upSec}/3600%24)) ; let days=$((${upSec}/86400)) ; if [ ${days} -ne 0 ]; then echo -n ${days}d; fi ; echo -n ${hours}h${mins}m)\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:.\n\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[1;31m\]$(ls -l | grep "^-" | wc -l | tr -d " ") \[\033[0m\]\[\033[0;28m\]files using \[\033[0m\]\[\033[1;31m\]$(ls --si -s | head -1 | awk '\''{print $2}'\'')\[\033[0m\]\[\033[1;30m\]] [\[\033[0m\]\[\033[1;31m\]\u\[\033[0m\]\[\033[0;31m\]@\[\033[0m\]\[\033[1;31m\]\h \[\033[0m\]\[\033[1;34m\]\w\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:.\n\[\033[0m\]\[\033[0;31m\].:\[\033[0m\]\[\033[1;30m\][\[\033[0m\]\[\033[1;31m\]\t\[\033[0m\]\[\033[1;30m\]]\[\033[0m\]\[\033[0;31m\]:. \[\033[0m\]\[\033[1;37m\]$ \[\033[0m\]'

Donner un coup de feu. Cela donne de bonnes informations, mais cela entraînera une augmentation de la charge sur vos boîtes simplement en appuyant sur Entrée à l'invite!

Glen Solsberry
la source
1
hah, très impressionnant!
Dave K
Semble bon, mais ne fonctionne pas sur ma boîte freebsd :(
Eugene Yarmash
@eugene y: Certains de ces chemins ne sont probablement pas sur les box FreeBSD ...
Glen Solsberry
Effrayant, mais impressionnant!
siliconpi
3

Je suis fan de l'invite bash Cygwin par défaut:

PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '

ou sans couleurs:

PS1='\n\u@\h \n\$ '

ressemble à:

username@hostname
$ ls -l
spoulson
la source
2

J'aime inclure le temps dans le mien. Me donne une sorte de construit timeautour de mes commandes:

PS1="[\t \u@\h:\w]$ "

Bien qu'après en avoir vu quelques-uns, cela me donne envie de rendre le mien un peu plus intelligent!

Glen Solsberry
la source
2

Voici le mien (faites défiler vers la droite pour voir un morceau plus intéressant):

'-------------------------------------------------------------------------------\n${debian_chroot:+($debian_chroot)}[\w]\n\u@\h\[\033[1;33m\]\[\033[0m\]($(__git_ps1 "%s")$(parse_git_dirty))$ 

Voici le résultat:

-------------------------------------------------------------------------------
[~]
user@host()$ 

Quand je suis dans un dépôt Git :

-------------------------------------------------------------------------------
[~/path_to_repo]
user@host(master)$ 

J'ai choisi d'utiliser plusieurs sauts de ligne et la "règle horizontale" pour faciliter la numérisation des tampons, et les longs chemins ne poussent donc pas le curseur trop loin vers la droite.

Ivan
la source
1

Dans ksh:

Dans mon .profile, j'ai défini le var suivant (donc ce var n'est défini qu'une seule fois par session, peu importe le nombre de 'su' que je fais:

PCH=\>

Dans mon .kshrc j'ai:

if let "${SPID:-0} != $$"; then
    PCHS="$PCHS$PCH"
fi

Je deviens root avec l'alias suivant, plutôt que "su" (kroot est un utilisateur root avec un shell ksh au lieu de sh (solaris) ou bash (linux):

alias root='PCH=\# su -m kroot'
alias me="PCH=\> su -m $USER"

J'ai également défini ces deux fonctions:

function lprompt {
  PS1=$HOST' $? $PWD '"$PCHS "
}
function sprompt {
  PS1='$?":"${PWD##*/}'"$PCHS "
}

et enfin à la fin du .kshrc j'ai:

lprompt

Tout cela me donne par défaut un réglage automatique de la fin de mon invite pour indiquer si je suis root (et à mon tour si j'ai un parent root), le répertoire de travail actuel, le nom d'hôte et l'état de sortie du dernier processus. sprompt supprime le nom d'hôte, réduit le chemin d'accès uniquement au nom de base et supprime les espaces:

g3 0 /home/jj33 > expr 1 / 0
expr: division by zero
g3 2 /home/jj33 > expr 1 / 1
1
g3 0 /home/jj33 > root
Password: 
g3 0 /home/jj33 ># me
g3 0 /home/jj33 >#> ^D
g3 0 /home/jj33 ># sprompt
0:jj33># me
g3 0 /home/jj33 >#> sprompt
0:jj33>#>expr 1 / 0
expr: division by zero
2:jj33>#>

Les alias root / me sont bourne de l'administration pré-sudo sur Solaris et les vieilles habitudes sont mortes. Je doute que quiconque appliquerait exactement la même chose de nos jours. Les fonctions de changement rapide et le statut existant continuent d'être très précieux pour moi.

jj33
la source
1

J'ai une invite qui est simple, mais utilise des couleurs pour donner des informations supplémentaires:

drewble:~$ 

La couleur du nom d'hôte (drewble, dans ce cas) est différente sur chaque machine - lorsque j'obtiens une nouvelle machine sur laquelle je travaille, je choisis une couleur arbitraire pour cette machine. De cette façon, lorsque j'ai beaucoup de terminaux ouverts, il est facile de dire dans quelle machine ils sont SSHed et réduit les erreurs que je fais en étant sur la mauvaise machine. De plus, lorsque je le fais sudo -s, je mets le nom d'hôte dans toutes les majuscules et colorie le côlon en rouge, encore une fois, cela réduit les erreurs en indiquant clairement que vous agissez en tant que root. Le chemin (mon répertoire personnel, ~dans ce cas) est en vert clair, ce qui permet de séparer les lignes de sortie; si quelque chose crée beaucoup de sortie, il est facile de faire défiler vers le haut et de voir où la sortie a commencé.

# Color the hostname
HOSTNAME=`hostname|sed -e 's/\..*$//'`
if [ $HOSTNAME = 'Caligula' ] || [ $HOSTNAME = 'Caligula.local' ]; then
    export HOST_COLOR="\[\033[1;35m\]"
fi
if [ $HOSTNAME = 'drewble' ]; then
    export HOST_COLOR="\[\033[1;34m\]"
fi
if [ $HOSTNAME = 'davinci' ]; then
    export HOST_COLOR="\[\033[1;31m\]"
fi

# Color the colon red & capitalize hostname if root
COLON_COLOR='0m'
if [ ${UID} -eq 0 ]; then
    COLON_COLOR='1;31m'
fi
if [ ${UID} -eq 0 ]; then
    HOSTNAME="`echo $HOSTNAME|tr '[a-z]' '[A-Z]'`"
fi

# Set the actual prompt
PS1=`echo -ne "$HOST_COLOR$HOSTNAME\[\033[00m\]\[\e[$COLON_COLOR\]:\[\033[01;32m\]\w\[\033[00m\]\\[\033[01;33m\]\$\[\033[00m\] "`
Drew Stephens
la source
1

Ce n'est pas une invite de shell, mais c'est une personnalisation qui peut correspondre à l'esprit de ce que vous demandez.

J'ai défini la variable d'environnement suivante:

if [ -z "$PROMPT_COMMAND" ]; then
    export PROMPT_COMMAND='history -a'
else
    export PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
fi

De cette façon, si j'ai plusieurs terminaux ouverts via l'écran ou autre chose, je ne perdrai pas l'historique lorsqu'ils s'encombreront mutuellement.

deinspanjer
la source
1
  export PS1="\[`if [[ $? = 0 ]]; then echo '\e[32m\h\e[0m'; else echo '\e[31m\h\e[0m' ; fi`:\w\n$ "

Cela affiche:

hostname:~
$ 

Avec 'hostname' en vert si le dernier code retour de la commande exécutée était '0' et en rouge s'il était> '0'.

jtimberman
la source
1

Semblable à la réponse du chaos , j'aime un peu

\u@\h:\w\n\u@\h:\$

ce qui me donne

root@host-10548:/var/www/site.org
root@host-10548:$

En incluant l'utilisateur / hôte sur la première ligne, je peux facilement copier toute cette ligne de chemin lorsque j'utilise SCP ou rsync pour envoyer des fichiers dans ce répertoire.

Zoredache
la source
Excellente idée. Je peux voir que le chemin scp complet est très utile. La deuxième ligne pourrait être améliorée en ajoutant le temps comme suggéré par gms8994.
Dave K
0

Pour bash j'aime

PS1 = "\ h \ d \ t \ w \ n \ u>"

ce qui se traduit par:

myserver lun sept 07 07:43:11 / u08
root>

Vous obtenez donc le nom d'hôte, la date et l'heure, le chemin complet, puis le nom d'utilisateur sur une nouvelle ligne, avec l'invite. C'est pour minimiser le retour à la ligne en profondeur dans les répertoires. Je suis dans et hors des boîtes toute la journée, donc tout ce que je peux faire pour rester droit est bon. J'ai également mis du mastic pour tout enregistrer. Je peux revenir en arrière et regarder les journaux et voir exactement ce que je faisais quand. Également pratique pour déterminer les séquences d'événements dans plusieurs fenêtres de terminal à la fois.

Ronald Pottol
la source
0

Mon invite normale est

\u@\h $PWD $WINDOW [$?] \$

Cela me donne l'utilisateur actuel, le répertoire actuel de l'hôte actuel ( sans remplacer $ HOME par ~), la screenfenêtre actuelle et le dernier retour d'erreur. Étant donné que j'ai normalement 16 fenêtres d'écran ou plus ouvertes, il est utile de connaître la fenêtre actuelle.

staticsan
la source
0

Mon invite zsh:

[andrew@hostname ~]%

Normalement, c'est rouge et blanc avec le répertoire courant en rose. Si root, c'est gris plus foncé avec le nom d'hôte en rouge. Si ce $?n'est pas 0, le% final est affiché en rouge.

function precmd {

   ERR=$?

   if [ $UID -eq 0 ]; then
       MYPROMPT="$(print '%{\e[1;30m%}[%{\e[0m%}')$(print '%{\e[1;31m%}%n%{\e[0m%}')@$(print '%{\e[1;31m%}%m%{\e[0m%}') $(print '%{\e[1;35m%}%3c%{\e[0m%}')$(print '%{\e[1;30m%}]%{\e[0m%}')"
   else
       MYPROMPT="[$(print '%{\e[1;31m%}%n%{\e[0m%}')@%m $(print '%{\e[1;35m%}%3c%{\e[0m%}')]"
   fi

   if [ $ERR -ne 0 ]; then
       ERROR="$(print '%{\e[1;31m%}%#%{\e[0m%}') "
       export PS1=$MYPROMPT$ERROR
   else
       export PS1="$MYPROMPT%# "
   fi

   export RPS1=""
}
l'autre reçoit
la source