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

98

È possibile cambiare i colori nel prompt dei comandi per [email protected] , così come la directory corrente e le parti di comando della visualizzazione dei prompt?

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

Sarebbe molto utile quando, ad esempio, provando a compilare programmi che hanno errori, dal momento che messaggi lunghi e non formattati rendono difficile distinguere quali linee sono comandi e quali output.

    
posta Luiz Rodrigo 19.04.2012 - 00:51

3 risposte

124

Puoi modificare le impostazioni modificando il file: ~/.bashrc .

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

  2. Cerca la riga con #force_color_prompt=yes e uncomment (elimina # ).

  3. Cerca la riga sotto if [ "$color_prompt" = yes ]; then che dovrebbe avere il seguente aspetto:

    PS1='${debian_chroot:+($debian_chroot)}\[3[01;32m\]\[email protected]\h\[3[00m\]:\[3[01;34m\]\w\[3[00m\]\$ '
    

    Prestare attenzione alla parte \[email protected]\h che dice "utente @ host" e al numero precedente a \[3[01;32m\] indica il colore. Questo è ciò che devi cambiare. Ad esempio, consente di modificare l'utente in viola, il "@" in nero e l'host in verde. Modifica la linea in modo che assomigli:

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

Risultato:

Inumerideicolorisono:

Black0;30DarkGray1;30Blue0;34LightBlue1;34Green0;32LightGreen1;32Cyan0;36LightCyan1;36Red0;31LightRed1;31Purple0;35LightPurple1;35Brown0;33Yellow1;33LightGray0;37White1;37

Riferimenti: 1 , 2 .

    
risposta data desgua 19.04.2012 - 03:56
34

Puoi provare BashrcGenerator . Questo è di gran lunga il modo più semplice per ottenere un prompt come vuoi tu. Ho notato che i colori qui definiti possono 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\]"

Root server:

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 che rifletta un diverso tipo 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'ultima richiesta ha un tocco in più. Aggiunge una nuova riga dopo il prompt e una nuova riga vuota prima. Ora puoi visualizzare il percorso completo della directory senza problemi e rende più chiaro dove inizia un nuovo comando, in caso di output lungo.

    
risposta data SPRBRN 13.11.2014 - 12:59
6

Per i dettagli, consulta questo HOWTO dettagliato .

In breve, puoi modificare il prompt modificando la variabile di ambiente $ PS1. C'è così tanto da dire qui, che ti mostrerò semplicemente la mia richiesta e ti rimanderò al link sopra per maggiori dettagli.

Le parti relative ai colori 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="\[3[1;33m\]"     #First color
  COLOR2="\[3[0;33m\]"     #Second color
  NO_COLOR="\[3[0m\]"      #Transparent - don't change

  case $TERM in 
    xterm*)
      TITLEBAR="\[3]0;\h - \w# 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="\[3[1;33m\]"     #First color
  COLOR2="\[3[0;33m\]"     #Second color
  NO_COLOR="\[3[0m\]"      #Transparent - don't change

  case $TERM in 
    xterm*)
      TITLEBAR="\[3]0;\h - \w%pre%7\]"
      ;;
    *)
      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="3[0;0;33m"     #First color
  local COLOR2="3[0;0;36m"     #Second color
  local NO_COLOR="3[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
7\]" ;; *) 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="3[0;0;33m" #First color local COLOR2="3[0;0;36m" #Second color local NO_COLOR="3[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 funzionalità, come i nomi abbreviati delle directory (vedi la funzione bash_prompt_shortener ), la visualizzazione automatica dell'ultimo stato di uscita del comando se diverso da zero (funzione checkExitStatus ) e la visualizzazione di il tempo nelle colonne più a destra (funzione print_prompt_time ).

    
risposta data Scott Severance 19.04.2012 - 02:27

Leggi altre domande sui tag