Quali sono alcuni prompt di shell utili e informativi? (Bash, csh, ksh, ecc.)


8

Uno dei miei consigli preferiti sul terminale Mac OS X prevede l'aggiunta dell'ultimo processo in esecuzione nel titolo del terminale usando il seguente codice nel tuo .bashrc .

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

Ora sto cercando di personalizzare il mio prompt di Bash dall'impostazione predefinita in qualcosa di più funzionale. Quali sono alcuni utili esempi di prompt della shell?

Risposte:


6

Uso un semplice doppio rivestimento:

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

o

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

se root. Le persone mi guardano come se fossi pazzo per l'uso di un prompt a due righe, ma odio vedere solo l'ultima parte del percorso corrente e lavoro con percorsi troppo lunghi per mettere l'intera cosa sulla stessa riga del area di input.


Quindi devo essere pazzo per aver usato un prompt a 3 righe, lol.
Ivan,

7

Ho uno script ~/bin/setpromptche viene eseguito da my .bashrc, che contiene:

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} "

Questo script imposta il prompt sul nome host seguito da :)se l'ultimo comando ha avuto esito positivo e :(se l'ultimo comando ha avuto esito negativo.


4

Questo, tuttavia, è il più fantastico che abbia mai visto:

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\]'

Dagli Un colpo. Fornisce buone informazioni, ma in realtà farà aumentare il carico sulle tue scatole semplicemente premendo invio al prompt!


1
ah, davvero impressionante!
Dave K,

Sembra buono, ma non funziona sulla mia casella freebsd :(
Eugene Yarmash

@eugene y: Alcuni di questi percorsi probabilmente non si trovano sulle caselle di FreeBSD ...
Glen Solsberry

Sguardo spaventoso, ma impressionante!
siliconpi,

3

Sono un fan del prompt di base di Cygwin predefinito:

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

o senza colori:

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

sembra:

username@hostname
$ ls -l

2

Mi piace includere il tempo nel mio. Mi dà una sorta di built-in timeattorno ai miei comandi:

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

Anche se dopo aver visto alcuni di questi, mi fa venire voglia di rendere il mio un po 'più intelligente!


2

Ecco il mio (scorri verso destra per vedere bit più interessanti):

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

Ecco il risultato:

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

Quando sono all'interno di un repository Git :

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

Ho scelto di utilizzare più interruzioni di riga e il "righello orizzontale" per semplificare la scansione dei buffer e così i nomi di percorsi così lunghi non spingono il cursore troppo a destra.


1

In ksh:

Nel mio .profile, ho impostato la seguente var (quindi questa var è impostata una sola volta per sessione, indipendentemente da quante 'su' faccio:

PCH=\>

Nel mio .kshrc ho:

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

Divento root con il seguente alias, piuttosto che "su" (kroot è un utente root con una shell ksh invece di sh (solaris) o bash (linux):

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

Ho anche definito queste due funzioni:

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

e finalmente alla fine di .kshrc ho:

lprompt

Tutto ciò mi dà l'impostazione automatica predefinita della fine del mio prompt per indicare se sono root (e a sua volta se ho un genitore che era root), directory di lavoro corrente, nome host e stato di uscita dell'ultimo processo. sprompt elimina il nome host, riduce il percorso fino al solo nome base e rimuove gli spazi:

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>#>

Gli alias root / me provengono dall'amministrazione pre-sudo su Solaris e le vecchie abitudini sono morte duramente. Dubito che qualcuno implementerebbe esattamente la stessa cosa in questi giorni. Le funzioni che cambiano rapidamente e lo stato esistente continuano a essere molto utili per me.


1

Ho un prompt che è semplice, ma usa i colori per dare alcune informazioni extra:

drewble:~$ 

Il colore del nome host (drewble, in questo caso) è diverso su ogni macchina - quando ottengo una nuova macchina su cui lavoro, scelgo un colore arbitrario per quella macchina. In questo modo, quando ho molti terminali aperti, è facile dire in quale macchina sono SSHed e riduce gli errori che faccio facendo sulla macchina sbagliata. Inoltre, quando lo faccio sudo -s, inserisco il nome host in maiuscolo e colorato di rosso i due punti, di nuovo, questo riduce gli errori chiarendo che stai agendo come root. Il percorso (la mia home directory, ~in questo caso) è in verde brillante, che aiuta a separare le linee di output; se qualcosa crea molto output, è facile scorrere verso l'alto e vedere dove è iniziato l'output.

# 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\] "`

1

Non è un prompt della shell, ma è una personalizzazione che potrebbe adattarsi allo spirito di ciò che stai chiedendo.

Ho impostato la seguente variabile d'ambiente:

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

In questo modo, se ho più terminali aperti tramite schermo o altro, non perderò la cronologia quando si intasano a vicenda cambiando.


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

Questo mostra:

hostname:~
$ 

Con 'nomehost' in verde se l'ultimo codice di ritorno del comando eseguito era '0' e rosso se era> '0'.


1

Simile alla risposta del caos , mi piace

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

che mi dà

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

Includendo l'utente / host sulla prima riga, posso facilmente copiare l'intera linea del percorso quando sto usando SCP o rsync per inviare alcuni file a quella directory.


Ottima idea Vedo che avere il percorso scp completo è molto utile. La seconda riga potrebbe essere migliorata aggiungendo il tempo suggerito da gms8994.
Dave K,

0

Per bash mi piace

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

che si traduce in:

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

Quindi ottieni nome host, data e ora, percorso completo e quindi nome utente su una nuova riga, con il prompt. Questo per ridurre al minimo l'avvolgimento della linea nelle directory. Sono dentro e fuori dalle scatole tutto il giorno, quindi tutto ciò che posso fare per mantenerlo dritto è buono. Ho anche impostato putty per registrare tutto. Posso tornare indietro e guardare i registri e vedere esattamente cosa stavo facendo quando. Utile anche per capire sequenze di eventi in più finestre terminali contemporaneamente.


0

Il mio normale prompt è

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

Questo mi dà l'utente corrente, la directory corrente dell'host corrente ( senza sostituire $ HOME con ~), la screenfinestra corrente e l'ultimo errore restituito. Dal momento che normalmente ho 16 o più finestre aperte, è utile conoscere quella corrente.


0

Il mio prompt zsh:

[andrew@hostname ~]%

Normalmente, è rosso e bianco con la directory corrente in rosa. Se root è grigio più scuro con il nome host in rosso. Se $?non è 0, la% finale viene visualizzata in rosso.

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=""
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.