Come rendere il terminale display user @ machine in grassetto?


31

Ho visto in alcune schermate (non ricordo dove sul web) che il terminale può visualizzare le [username@machine /]$lettere in grassetto. Non vedo l'ora di ottenerlo anche perché mi trovo sempre a scorrere lunghe uscite per scoprire con difficoltà la prima riga dopo il mio comando.

Come posso rendere grassetto o colorato il nome utente, ecc.?


Puoi chiarire se stai usando la shell bash o qualche altra shell?
Stephen Quan,

Gnome Terminal bash.
Benjamin,

Risposte:


22

Dovresti essere in grado di farlo impostando la PS1variabile prompt nel tuo ~/.bashrcfile in questo modo:

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

Per renderlo colorato (e possibilmente in grassetto - questo dipende dal fatto che l'emulatore di terminale lo abbia abilitato) è necessario aggiungere i codici colore di escape:

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

Qui, tutto ciò che non viene sfuggito tra le parti 1;91me 0mverrà colorato nel 1;91colore (rosso grassetto). Inserisci questi codici di escape in diverse parti del prompt per utilizzare colori diversi, ma ricorda di reimpostare i colori con 0mo altrimenti avrai anche un output colorato a colori. Ricordarsi di eseguire il sorgente del file in seguito per aggiornare la shell corrente:source ~/.bashrc


Perché non usare 31 per il rosso? 91 non sembra essere un codice standard.
jw013,

1
@ jw013 L'intervallo 90-97 è equivalente all'intervallo 30-37 se utilizzato come grassetto ie 1;31e 1;91. Usando il normale peso del carattere, l'intervallo 90-97 offre colori più luminosi rispetto agli altri.

45

Trova dove PS1si trova il tuo .bashrce inseriscilo '\[\e[1m\]'all'inizio e \[\e[0m\]alla fine.

  • \[e \]sono necessari in modo che la shell sappia che il disordine all'interno occupa 0 spazio sullo schermo, il che impedisce alcuni comportamenti sbagliati durante la modifica delle linee. Non devi preoccuparti troppo.
  • \e[è noto come CSI (introduttore della sequenza di controllo). Lo vedrai usato nella maggior parte dei codici elencati nella pagina di Wikipedia referenziata. \e indica il carattere di fuga.
  • Se guardi nella tabella SGR sulla pagina di Wikipedia, vedrai che 1 è il numero per il testo chiaro / in grassetto e 0 è per il ripristino. Quindi CSI 1mattiva il grassetto e CSI 0mreimposta il carattere in modo che il resto del testo sia normale.

Wikipedia ha un elenco completo di codici di escape ANSI che puoi utilizzare se l'emulatore di terminale lo supporta.

modificare

Per la portabilità e la leggibilità, è necessario utilizzare tputinvece di codici di escape con codifica rigida. L'unico aspetto negativo è che l' tputapproccio non funziona con i terminali che supportano i codici ANSI ma hanno database terminfo rotti o mancanti, ma in tal caso il terminfo rotto è un problema maggiore in quanto molte app della console che si basano su terminfo potrebbero non funzionare correttamente.

Ecco un esempio di cosa faccio nel mio .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\] "

Ecco come sarebbe una mia versione generica. Lo 0è lo stato di uscita dell'ultimo comando.

Schermata PS1


Risposta simpatica ed esplicativa, +1. Tuttavia ho trovato la risposta di Hesse più al punto, quindi l'ho scelta.
Benjamin,

Quando ho provato questo, ho riscontrato un problema come il prompt del Terminale che non si svolgeva correttamente . Fai? Hai sequenze di escape aggiornate?
Stefan Lasiewski,

6

Questo è il prompt predefinito che si ottiene nella cygwin bash shell:

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

inserisci qui la descrizione dell'immagine

\[\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

Riferimenti:


Bene, ho aggiunto una nuova riga prima di [user @ host] che rende ogni comando ancora più leggibile (dovrebbe essere impostato di default sul terminale imo).
Benjamin,

2

Uso questa funzione shell per ottenere gli attributi di testo nel terminale:

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
}

Quindi per usarlo:

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

Questo mi dà [username@hostname]:cwd>dove username@hostnamesono il verde grassetto e il cwdblu grassetto.


Grazie per questo. Suppongo di dover copiare anche tutto quanto sopra in ~/.bashrc?
Benjamin,

Sì, l'ho impostato nel mio ~/.bashrcfile e lo uso per impostare il mio prompt. Cambio anche i colori a seconda del sistema in cui mi trovo.
Arcege,

1

Per farlo sembrare un prompt di Ubuntu predefinito, aggiungi

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

nel tuo ~/.bashrc.

Questo produrrà il noto verde user@host(grassetto), seguito da due punti bianchi non in grassetto, seguito dalla tua directory di lavoro in grassetto blu, seguita da un $segno, uno spazio e il tuo comando in lettere bianche non in grassetto:

Prompt di Ubuntu Bash

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.