Como tornar o terminal display user @ machine em negrito?

27

Eu tenho visto em algumas telas (não me lembro onde na web) que o terminal pode exibir o [username@machine /]$ em negrito. Estou ansioso para conseguir isso também, porque sempre me vejo percorrendo longas saídas 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?

    
por Benjamin 14.02.2012 / 22:41

4 respostas

20

Você deve ser capaz de fazer isso configurando a variável PS1 no seu arquivo ~/.bashrc da seguinte forma:

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

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

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

Aqui, tudo que não está sendo salvo entre as partes 1;91m e 0m será colorido na cor 1;91 (vermelho em negrito). Coloque esses códigos de escape em torno de diferentes partes do prompt para usar cores diferentes, mas lembre-se de redefinir as cores com 0m ou então você terá saída de terminal colorida também. Lembre-se de fornecer o arquivo posteriormente para atualizar o shell atual: source ~/.bashrc

    
por 14.02.2012 / 22:45
41

Encontre onde seu PS1 está definido no seu .bashrc e 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 ao fazer a edição de linha. Você não precisa se preocupar muito com isso.
  • \e[ é conhecido como o CSI (introdutor de seqüência de controle). Você verá que é usado na maioria dos códigos listados na página da Wikipédia referenciada. \e significa o caractere de escape.
  • Se você olhar na tabela SGR na página da Wikipedia, verá que 1 é o número para texto claro / negrito e 0 é para redefinir. Assim, CSI 1m ativa o negrito e CSI 0m redefine a fonte para que o restante do texto seja normal.

A Wikipedia tem uma lista completa dos códigos de escape ANSI que você pode usar se o emulador de terminal for compatível.

Editar

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

Veja um exemplo do que eu 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\] "

Veja como seria uma versão genérica da minha. O 0 é o status de saída do último comando.

    
por 14.02.2012 / 22:47
6

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

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

\[\e]0;\w\a\]=SettheWindowtitletoyourcurrentworkingdirectory\n=newline\[\e[32m\]=Settextcolortogreen\u@\h=displayusername@hostname\[\e[33m\]=Settextcolortoyellow\w=displayworkingdirectory\[\e[0m\]=Resettextcolortodefault\n=newline\$=display$prompt

Referências:

  • VejamanbasheverifiqueaseçãoPROMPTING.
  • Veja código de escape ANSI - Wikipedia .
por 14.02.2012 / 23:17
2

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

color () {
  if [ -z "$1" -a -z "$2" -a -z "$3" ]; then
    echo "3[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='3['
  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
}

Em seguida, use:

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> , em que username@hostname está em negrito e cwd está em negrito.

    
por 14.02.2012 / 22:51