Modifica dei colori per l'utente, l'host, le informazioni sulla directory nel prompt dei comandi del terminale


104

È possibile modificare i colori nel prompt dei comandi per la visualizzazione user@computerdella directory e dei comandi correnti del prompt?

Ho già visto qualcosa di simile fatto dagli utenti OSX, ma non so come fare la stessa cosa nel terminale GNOME (posso solo cambiare i colori di primo piano e di sfondo).

Sarebbe molto utile, ad esempio, quando si tenta di compilare programmi che presentano errori, poiché i messaggi lunghi e non formattati rendono difficile distinguere quali righe sono comandi e quali vengono emesse.

Colori nel terminale osx


1
Stai cercando bashimpostazioni (o impostazioni per la tua shell preferita), non Gnome Terminal.
Scott Severance,

Risposte:


135

È possibile modificare le impostazioni di Modifica del file: ~/.bashrc.

  1. Aprire il file: gedit ~/.bashrc.

  2. Cerca la riga con #force_color_prompt=yese decommenta (elimina il #).

  3. Cerca la riga seguente if [ "$color_prompt" = yes ]; thenche dovrebbe apparire come:

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

    Prestare attenzione alla parte \u@\hche sta dicendo "user @ host" e il numero prima che \[\033[01;32m\]indichi il colore. Questo è ciò che devi cambiare. Ad esempio, consente di cambiare l'utente in viola, "@" in nero e l'host in verde. Modifica la linea in modo che appaia:

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

Risultato:
inserisci qui la descrizione dell'immagine

I numeri dei colori sono:

Nero 0; 30 Grigio scuro 1; 30
Blu 0; 34 Azzurro 1; 34
Verde 0; 32 Verde chiaro 1; 32
Ciano 0; 36 Ciano chiaro 1; 36
Rosso 0; 31 Rosso chiaro 1; 31
Viola 0; 35 Viola chiaro 1; 35
Marrone 0; 33 Giallo 1; 33
Grigio chiaro 0; 37 Bianco 1; 37

Riferimenti: 1 , 2 .


Sono contento che funzioni. Benvenuto.
desgua,

Vale anche la pena ricordare che non è necessario cambiare il colore Palettedal Terminale Preferencesprima di provare questo, poiché causerà molta confusione con i codici colore.
Rifaz Nahiyan,

Ma come possiamo creare una stringa particolare da mostrare in un colore particolare? Come dire c'è un messaggio di errore che viene stampato in un formato specifico, che voglio vederlo in colore rosso. OPPURE In GDB, quando vedo un messaggio del tipo - "avviso: il file di origine è più recente dell'eseguibile", voglio che questo sia visualizzato in colore rosso. Come si può ottenere questo?
Darshan L

36

Puoi provare BashrcGenerator . Questo è di gran lunga il modo più semplice per ottenere un prompt come desideri. Ho notato che i colori definiti qui potrebbero essere diversi dal tuo sistema, ma questo è un piccolo problema. Con il codice generato puoi cambiare tu stesso i colori.

Utente del server:

export PS1="\[\e[01;37m\][\[\e[0m\]\[\e[01;32m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;34m\]\h\[\e[0m\]\[\e[00;37m\] \[\e[0m\]\[\e[00;37m\]\t\[\e[0m\]\[\e[01;37m\] \W]\\$ \[\e[0m\]"

Server root:

export PS1="\[\e[01;37m\][\[\e[0m\]\[\e[01;31m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;34m\]\h\[\e[0m\]\[\e[00;37m\] \[\e[0m\]\[\e[00;37m\]\t\[\e[0m\]\[\e[01;37m\] \W]\\$ \[\e[0m\]"

E se necessario, puoi cambiare il colore del nome host in modo da riflettere diversi tipi di server.

Uso un formato diverso per il mio computer locale:

export PS1="\[\e[01;33m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;36m\]\h\[\e[0m\]\[\e[00;37m\] \t \[\e[0m\]\[\e[01;35m\]\w\[\e[0m\]\[\e[01;37m\] > \[\e[0m\]"

Il mio preferito ora:

export PS1="\n\[\e[01;33m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;36m\]\h\[\e[0m\]\[\e[00;37m\] \t \[\e[0m\]\[\e[01;35m\]\w\[\e[0m\]\[\e[01;37m\] \[\e[0m\]\n$ "

Quest'ultimo prompt ha un bel tocco. Aggiunge una nuova riga dopo il prompt e una nuova riga vuota prima. Ora è possibile visualizzare il percorso completo della directory senza problemi e questo rende più chiaro dove inizia un nuovo comando, in caso di output lungo.


5
Generatore PS1: +1: D
anishsane,

1
mi è davvero piaciuto molto l'ultimo, ero preoccupato perché il nome utente e il percorso mi occupavano molto spazio, con l'ultima opzione puoi ottenere l'intero schermo
Damián Rafael Lattenero

Questo ha funzionato alla grande! tuttavia, come posso farlo per host specifici? vale a dire impostare una combinazione di colori specifica quando, ad esempio, utilizzo un server di produzione? devo farlo "manualmente" con blocchi if-fi in .bashrc? o c'è un modo più elegante?
Acapulco,

Su ogni host a cui accedi, disponi di un file .bashrc personale per quell'utente remoto e puoi cambiarlo. Se diventi root, questo ha le sue impostazioni, che verranno visualizzate da altri utenti se diventano root.
SPRBRN,

6

Per i dettagli, vedere questo HOWTO dettagliato .

In breve, è possibile modificare il prompt modificando la variabile di ambiente $ PS1. C'è così tanto da dire qui, che ti mostrerò solo il mio prompt e ti rimando al link sopra per maggiori dettagli.

Le parti relative al colore sono nella funzione setPrompt:

# This function from: https://wiki.archlinux.org/index.php/Color_Bash_Prompt_%28%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%29#Wolfman.27s
##################################################
# Fancy PWD display function
##################################################
# The home directory (HOME) is replaced with a ~
# The last pwdmaxlen characters of the PWD are displayed
# Leading partial directory names are striped off
# /home/me/stuff          -> ~/stuff               if USER=me
# /usr/share/big_dir_name -> ../share/big_dir_name if pwdmaxlen=20
##################################################
bash_prompt_shortener() {
    # How many characters of the $PWD should be kept
    local pwdmaxlen=25
    # Indicate that there has been dir truncation
    local trunc_symbol=".."
    local dir=${PWD##*/}
    pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen ))
    NEW_PWD=${PWD/#$HOME/\~}
    local pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen ))
    if [ ${pwdoffset} -gt "0" ]
    then
        NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen}
        NEW_PWD=${trunc_symbol}/${NEW_PWD#*/}
    fi
}


function setPrompt {
  COLOR1="\[\033[1;33m\]"     #First color
  COLOR2="\[\033[0;33m\]"     #Second color
  NO_COLOR="\[\033[0m\]"      #Transparent - don't change

  case $TERM in 
    xterm*)
      TITLEBAR="\[\033]0;\h - \w\007\]"
      ;;
    *)
      TITLEBAR=""
      ;;
  esac

  local dash_open="${COLOR1}-${COLOR2}-"
  local dash_close="${COLOR2}-${COLOR1}-"
  local spacer="${COLOR2}-"
  local jobs_and_history="${COLOR2}(${COLOR1}\!${COLOR2}:${COLOR1}\j${COLOR2})"
  local user_host="${COLOR2}(${COLOR1}\u${COLOR2}@${COLOR1}\H${COLOR2})"
  local host="${COLOR2}(${COLOR1}\H${COLOR2})"
  local root_or_not="${COLOR2}(${COLOR1}\\\$${COLOR2})"
  local cwd="${COLOR2}(${COLOR1}\w${COLOR2})"
  #PS1="${TITLEBAR}${COLOR1}-${COLOR2}-(${COLOR1}\!${COLOR2}:${COLOR1}\j${COLOR2})-(${COLOR1}\w${COLOR2})-${COLOR1}-\n-${COLOR2}-(${COLOR1}\u${COLOR2}@${COLOR1}\H${COLOR2})-(${COLOR1}\\\$${COLOR2})-${COLOR1}- ${NO_COLOR}"
  #PS1="${TITLEBAR}${dash_open}${cwd}${spacer}${root_or_not}${dash_close}\n${dash_open}${jobs_and_history}${spacer}${host}${dash_close}${NO_COLOR} "
  #PS2="${COLOR2}--${COLOR1}- ${NO_COLOR}"
  PS1="${TITLEBAR}${COLOR1}"'${NEW_PWD}'"${COLOR2}:\$${NO_COLOR} "
  PS2="$spacer$dash_close$NO_COLOR "
}

bash_prompt_shortener
setPrompt
unset setPrompt

#Determine and display the exit Status of the last command, if non-zero.
function checkExitStatus() {
  local status="$?"
  local signal=""
  local COLOR1="\033[0;0;33m"     #First color
  local COLOR2="\033[0;0;36m"     #Second color
  local NO_COLOR="\033[0m"        #Transparent - don't change

  if [ ${status} -ne 0 -a ${status} != 128 ]; then
    # If process exited by a signal, determine name of signal.
    if [ ${status} -gt 128 ]; then
      signal="$(builtin kill -l $((${status} - 128)) 2>/dev/null)"
      if [ "$signal" ]; then
        signal="$signal"
      fi
    fi
    echo -e "${COLOR1}[Exit ${COLOR2}${status} ${signal}${COLOR1}]${NO_COLOR}" 1>&2
    #echo -ne "${COLOR1}[Exit ${COLOR2}${status}${COLOR1} ${COLOR2}${signal}${COLOR1}]${NO_COLOR} " 1>&2
    fi
  return 0
}
print_prompt_time() {
    printf "%*s\r" $(tput cols) "$(date '+%T')"
}

promptCmd() {
    checkExitStatus
    print_prompt_time
}

PROMPT_COMMAND=promptCmd

Oltre ai colori, il mio prompt ha alcune altre caratteristiche, come nomi di directory abbreviati (vedere la funzione bash_prompt_shortener), visualizzazione automatica dello stato di uscita dell'ultimo comando se diverso da zero (funzione checkExitStatus) e visualizzazione dell'ora nelle colonne più a destra (funzione print_prompt_time) .


Grazie per aver condiviso le tue funzioni personalizzate :) È solo con me che il timestamp scompare quando premo backspace?
Luiz Rodrigo,

No. Anch'io. C'è qualche bug che non ho giudicato abbastanza importante da provare a risolvere.
Scott Severance,
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.