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

104

É possível alterar as cores no prompt de comando para as user@computerpartes de diretório e de comando atuais e de exibição do prompt?

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

Seria muito útil quando, por exemplo, tentar compilar programas com erros, pois mensagens longas e não formatadas tornam difícil distinguir quais linhas são comandos e quais são produzidas.

Cores no terminal osx

Luiz Rodrigo
fonte
1
Você está procurando bashconfigurações (ou configurações para seu shell preferido), não o Gnome Terminal.
Scott Separação

Respostas:

135

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

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

  2. Procure a linha com #force_color_prompt=yese descomente (exclua a #).

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

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

    Preste atenção na parte \u@\hque está dizendo "usuário @ host" e o número antes de \[\033[01;32m\]indicar a cor. É isso que você precisa mudar. Por exemplo, vamos mudar o usuário para roxo, o "@" para preto e o host para verde. Edite a linha para que fique assim:

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

Resultado:
insira a descrição da imagem aqui

Os números das cores são:

Preto 0; 30 Cinza escuro 1; 30
Azul 0; 34 Azul claro 1; 34
Verde 0; 32 Verde claro 1; 32
Ciano 0; 36 Ciano claro 1; 36
Vermelho 0; 31 Vermelho claro 1; 31
Roxo 0; 35 Roxo claro 1; 35
Castanho 0; 33 Amarelo 1; 33
Cinza Claro 0; 37 Branco 1; 37

Referências: 1 , 2 .

desgua
fonte
Estou feliz que funcione. Bem vinda.
Des
Também vale a pena mencionar que você não deve mudar a cor Palettedo terminal Preferencesantes de tentar isso, pois isso causará muita confusão com os códigos de cores.
Rifaz Nahiyan
Mas como podemos criar uma sequência específica para aparecer em uma cor específica? Como dizer há uma mensagem de erro que é impressa em um formato específico, que eu quero vê-lo na cor vermelha. OU No GDB, quando vejo uma mensagem como - "aviso: o arquivo de origem é mais recente que o executável.", Quero que isso seja exibido em vermelho. Como isso pode ser alcançado?
Darshan L
36

Você pode experimentar o BashrcGenerator . Essa é 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 pequeno problema. Com o código gerado, você pode alterar as cores você mesmo.

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 formatos diferentes no 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 agradável. 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 fica mais claro onde um novo comando é iniciado, em caso de saída longa.

SPRBRN
fonte
5
Gerador PS1: +1: D
anishsane
1
realmente gostei do último, eu estava preocupado porque o nome de usuário eo caminho levou-me um monte de espaço, com a última opção você pode obter toda a tela
Damián Rafael Lattenero
Isso funcionou muito bem! no entanto, como posso fazer isso para hosts específicos? ou seja, definir um esquema de cores específico quando eu ssh em um servidor de produção, por exemplo? eu tenho que fazer isso "manualmente" com blocos if-fi no .bashrc? ou existe uma maneira mais elegante?
Acapulco
Em cada host que você fizer login, tenha um arquivo .bashrc pessoal para esse usuário remoto e poderá alterá-lo. Se você se tornar root, isso tem suas próprias configurações, que serão vistas por outros usuários se eles se tornarem root.
SPRBRN
6

Para detalhes, consulte este HOWTO detalhado .

Em resumo, você pode alterar o prompt editando a variável de ambiente $ PS1. Há muito o que dizer aqui, que mostrarei minha solicitação e encaminhá-lo ao link acima para obter 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="\[\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

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 da hora nas colunas mais à direita (função print_prompt_time) .

Scott Severance
fonte
Obrigado por compartilhar suas funções personalizadas :) É só comigo que o carimbo de data e hora desaparece quando pressiono backspace?
Luiz Rodrigo
Não. Eu também. Há algum bug que eu não julguei importante o suficiente para tentar corrigir.
Scott Severance