Alterando cores para usuário, host, informações de diretório no prompt de comando do terminal

100

É possível alterar as cores no prompt de comando para o user@computer , bem como o diretório atual e as partes de comando da exibição do prompt?

Já vi algo assim feito por usuários do OSX, mas não sei como fazer a mesma coisa no terminal do gnome (só posso alterar as cores de primeiro plano e de segundo plano).

Seria muito útil quando, por exemplo, tentássemos compilar programas com erros, já que mensagens longas e não formatadas dificultam a distinção de quais linhas são comandos e quais saem.

    
por Luiz Rodrigo 19.04.2012 / 00:51

3 respostas

132

Você pode editar as configurações editando o arquivo: ~/.bashrc .

  1. Abra o arquivo: gedit ~/.bashrc .

  2. Procure a linha com #force_color_prompt=yes e remova o comentário (exclua # ).

  3. Procure a linha abaixo de if [ "$color_prompt" = yes ]; then que deve se parecer com:

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

    Preste atenção na parte \u@\h que está dizendo "usuário @ host" e o número antes que \[3[01;32m\] indique a cor. Isso é o que você tem que mudar. Por exemplo, vamos alterar o usuário para roxo, o "@" para preto e o host para verde. Edite a linha para que pareça:

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

Resultado:

Osnúmerosdascoressão:

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

Referências: 1 , 2 .

    
por desgua 19.04.2012 / 03:56
35

Você pode experimentar o BashrcGenerator . Esta é de longe a maneira mais fácil de obter um prompt como você deseja. Percebi que as cores definidas aqui podem ser diferentes do seu próprio sistema, mas isso é um problema pequeno. Com o código gerado, você mesmo pode alterar as cores.

Usuário do servidor:

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

Raiz do servidor:

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 necessário, você pode alterar a cor do nome do host para refletir diferentes tipos de servidores.

Eu uso um formato diferente para o meu computador local:

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

Meu favorito agora:

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

Este último prompt tem um toque legal. Ele adiciona uma nova linha após o prompt e uma nova linha vazia antes. Agora você pode exibir o caminho completo do diretório sem problemas, e deixa mais claro onde um novo comando é iniciado, no caso de uma saída longa.

    
por SPRBRN 13.11.2014 / 12:59
6

Para detalhes, veja este detalhado HOWTO .

Em suma, você pode alterar o prompt editando a variável de ambiente $ PS1. Há muito a dizer aqui, que eu só vou mostrar o meu prompt e encaminhá-lo para o link acima para mais detalhes.

As partes relacionadas à cor estão na função 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

Além das cores, meu prompt possui alguns outros recursos, como nomes de diretório abreviados (consulte a função bash_prompt_shortener ), exibição automática do status de saída do último comando se diferente de zero (função checkExitStatus ) e exibição de a hora nas colunas mais à direita (função print_prompt_time ).

    
por Scott Severance 19.04.2012 / 02:27