Como fazer com que o terminal exiba user @ machine em negrito?

31

Vi em algumas capturas de tela (não me lembro onde na web) que o terminal pode exibir as [username@machine /]$letras em negrito. Estou ansioso para conseguir isso também, porque sempre me vejo percorrendo saídas longas para descobrir com dificuldade a primeira linha após o meu comando.

Como posso tornar o nome do usuário etc. em negrito ou colorido?

Benjamin
fonte
Você pode esclarecer se está usando o shell bash ou algum outro shell?
Stephen Quan
Gnome Terminal bash.
Benjamin

Respostas:

22

Você deve conseguir fazer isso definindo a PS1variável prompt no seu ~/.bashrcarquivo da seguinte maneira:

PS1='[\u@\h \w]\$ '

Para torná-lo colorido (e possivelmente em negrito - isso depende se o seu emulador de terminal o ativou), você precisa adicionar códigos de cores de escape:

PS1='\[\e[1;91m\][\u@\h \w]\$\[\e[0m\] '

Aqui, tudo o que não estiver escapando entre as peças 1;91me 0mserá colorido na 1;91cor (vermelho forte). Coloque esses códigos de escape em diferentes partes do prompt para usar cores diferentes, mas lembre-se de redefinir as cores com 0mou você também terá saída de terminal colorida. Lembre-se de fornecer o arquivo posteriormente para atualizar o shell atual:source ~/.bashrc


fonte
Por que não usar 31 para vermelho? 91 não parece ser um código padrão.
Jw013
1
@ jw013 O intervalo 90-97 é equivalente ao intervalo 30-37 se usado como negrito, ie 1;31e 1;91. Usando o peso normal da fonte, a faixa 90-97 fornece cores mais brilhantes que a outra.
45

Encontre onde PS1está o seu conjunto .bashrce insira '\[\e[1m\]'no início e \[\e[0m\]no final.

  • \[e \]são necessários para que o shell saiba que a bagunça dentro ocupa 0 espaço na tela, o que evita algum comportamento errado durante a edição de linha. Você não precisa se preocupar muito com isso.
  • \e[é conhecido como CSI (introdutor da sequência de controle). Você o verá usado na maioria dos códigos listados na página referenciada da Wikipedia. \e significa o caractere de escape.
  • Se você olhar na tabela SGR na página da Wikipedia, verá 1 como número para texto claro / negrito e 0 como redefinir. Assim, CSI 1mativa o negrito e CSI 0mredefine a fonte para que o restante do texto seja normal.

A Wikipedia possui uma lista completa de códigos de escape ANSI que você pode usar se o seu emulador de terminal suportar.

Editar

Para portabilidade e legibilidade, você deve usar em tputvez de códigos de escape codificados. A única desvantagem é que a tputabordagem não funciona com terminais que suportam códigos ANSI, mas possuem bancos de dados terminfo quebrados ou ausentes, mas nesse caso o terminfo quebrado é um problema maior, já que muitos dos aplicativos de console que dependem do terminfo podem não funcionar corretamente.

Aqui está um exemplo do que faço no meu .bashrc:

# color names for readibility
reset=$(tput sgr0)
bold=$(tput bold)
black=$(tput setaf 0)
red=$(tput setaf 1)
green=$(tput setaf 2)
yellow=$(tput setaf 3)
blue=$(tput setaf 4)
magenta=$(tput setaf 5)
cyan=$(tput setaf 6)
white=$(tput setaf 7)
user_color=$green
[ "$UID" -eq 0 ] && { user_color=$red; }
PS1="\[$reset\][\[$cyan\]\A\[$reset\]]\[$user_color\]\u@\h(\l)\
\[$white\]:\[$blue\]\W\[$reset\][\[$yellow\]\$?\[$reset\]]\[$white\]\
\\$\[$reset\] "

Aqui está a aparência de uma versão genérica minha. O 0é o status de saída do último comando.

Captura de tela do PS1

jw013
fonte
Resposta agradável e explicativa, +1. Ainda assim, eu achei a resposta do hesse mais direta, então eu a escolhi.
Benjamin
Quando tentei isso, deparei-me com um problema como o prompt do Terminal que não estava sendo quebrado corretamente . Você? Você atualizou as seqüências de escape?
Stefan Lasiewski
6

Este é o prompt padrão que você obtém no cygwin bash shell:

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

insira a descrição da imagem aqui

\[\e]0;\w\a\] = Set the Window title to your current working directory
\n            = new line
\[\e[32m\]    = Set text color to green
\u@\h         = display username@hostname
\[\e[33m\]    = Set text color to yellow
\w            = display working directory
\[\e[0m\]     = Reset text color to default
\n            = new line
\$            = display $ prompt

Referências:

Stephen Quan
fonte
Bom, adicionei uma nova linha antes do [usuário @ host], que torna cada comando ainda mais legível (deve ser definido por padrão no terminal imo).
21712 Benjamin Benjamin
2

Eu uso essa função shell para obter atributos de texto no terminal:

color () {
  if [ -z "$1" -a -z "$2" -a -z "$3" ]; then
    echo "\033[0m"
    return
  fi
  case $1 in
    black)   color_fg=30;;
    red)     color_fg=31;;
    green)   color_fg=32;;
    yellow)  color_fg=33;;
    blue)    color_fg=34;;
    magenta|purple) color_fg=35;;
    cyan)    color_fg=36;;
    white)   color_fg=37;;
    -)       color_fg='';;
    *)       color_fg=39;;
  esac
  case $2 in
    bold)      color_bd=1;;
    italics)   color_bd=3;;
    underline) color_bd=4;;
    inverse)   color_bd=7;;
    strike)    color_bd=9;;
    nobold)      color_bd=22;;
    noitalics)   color_bd=23;;
    nounderline) color_bd=24;;
    noinverse)   color_bd=27;;
    nostrike)    color_bd=29;;
    -)         color_bd='';;
    *)         color_bd=0
  esac
  case $3 in
    black)   color_bg=40;;
    red)     color_bg=41;;
    green)   color_bg=42;;
    yellow)  color_bg=43;;
    blue)    color_bg=44;;
    magenta|purple) color_bg=45;;
    cyan)    color_bg=46;;
    white)   color_bg=47;;
    -)       color_bg='';;
    *)       color_bg=49;;
  esac
  s='\033['
  if [ -n "$color_bd" ]; then
    s="${s}${color_bd}"
    if [ -n "$color_fg" -o -n "$color_bg" ]; then
      s="${s};"
    fi
  fi
  if [ -n "$color_fg" ]; then
    s="${s}${color_fg}"
    if [ -n "$color_bg" ]; then
      s="${s};"
    fi
  fi
  if [ -n "$color_bg" ]; then
    s="${s}${color_bg}"
  fi
  s="${s}m"
  echo "$s"
  unset s color_bd color_bg color_fg
}

Então, para usá-lo:

color_reset=`color`
color_grbd=`color green bold`
color_bubd=`color blue bold`
PS1="\[${color_grbd}\][\u@\h]\[${color_reset}\]:\[$color_budb}\]\w\[${color_reset}\]> "

Isso me dá [username@hostname]:cwd>onde username@hostnamesão negrito verde e cwdnegrito azul.

Arcege
fonte
Obrigado por isso. Suponho que também precisei copiar todos os itens acima em ~/.bashrc?
21712 Benjamin Benjamin
Sim, defino isso no meu ~/.bashrcarquivo e o uso para definir meu prompt. Eu até mudo as cores dependendo do sistema em que estou.
Arcege 15/02/12
1

Para parecer um prompt padrão do Ubuntu, adicione

export PS1='\[\e[1;32m\]\u@\h\e[0;39m\]:\e[1;34m\]\w\e[0;39m\]$\[\e[0m\] '

no seu ~/.bashrc.

Isso produzirá o conhecido verde user@host(negrito), seguido por dois pontos brancos não negritos, seguido pelo diretório de trabalho em azul negrito, seguido por um $sinal, um espaço e seu comando em letras brancas não negritas:

Prompt do Ubuntu Bash

Tobias Feil
fonte