Jak sprawić, by terminal wyświetlał użytkownika @ maszyna pogrubioną czcionką?

31

Widziałem na niektórych zrzutach ekranu (nie pamiętam, gdzie w Internecie), że terminal może wyświetlać [username@machine /]$pogrubione litery. Z niecierpliwością czekam na to, ponieważ zawsze przewijam długie wyniki, aby z trudem znaleźć pierwszą linię po moim poleceniu.

Jak mogę pogrubić lub pokolorować nazwę użytkownika itp.?

Benzoes
źródło
Czy możesz wyjaśnić, czy używasz powłoki bash, czy innej powłoki?
Stephen Quan
Gnome Terminal bash.
Benjamin

Odpowiedzi:

22

Powinieneś być w stanie to zrobić, ustawiając PS1zmienną pytania w swoim ~/.bashrcpliku w następujący sposób:

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

Aby był kolorowy (i być może pogrubiony - zależy to od tego, czy emulator terminalu go włączył), musisz dodać specjalne kody kolorów:

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

Tutaj wszystko, co nie ucieka między częściami 1;91mi, 0mzostanie zabarwione na 1;91kolor (pogrubiona czerwień). Umieść te kody ucieczki wokół różnych części monitu, aby użyć różnych kolorów, ale pamiętaj, aby zresetować kolory za pomocą, w 0mprzeciwnym razie będziesz mieć również kolorowe wyjście wyjściowe. Pamiętaj, aby później pobrać plik, aby zaktualizować bieżącą powłokę:source ~/.bashrc


źródło
Dlaczego nie użyć 31 dla czerwonego? 91 nie wydaje się być standardowym kodem.
jw013
1
@ jw013 Zakres 90-97 jest równoważny zakresowi 30-37, jeśli jest użyty pogrubiony tj . 1;31i 1;91. Przy normalnej gramaturze czcionek zakres 90-97 daje jaśniejsze kolory niż inne.
45

Znajdź, gdzie PS1jest ustawiony .bashrci wstaw '\[\e[1m\]'na początku i \[\e[0m\]na końcu.

  • \[i \]są konieczne, aby powłoka wiedziała, że ​​bałagan w środku zajmuje 0 miejsca na ekranie, co zapobiega popsuciu się podczas edycji linii. Nie musisz się tym zbytnio przejmować.
  • \e[jest znany jako CSI (wprowadzający sekwencję kontrolną). Zobaczysz go w większości kodów wymienionych na odnośnej stronie Wikipedii. \e oznacza znak ucieczki.
  • Jeśli spojrzysz na tabelę SGR na stronie Wikipedii, zobaczysz, że 1 to liczba jasnego / pogrubionego tekstu, a 0 to reset. CSI 1mWłącza więc pogrubienie i CSI 0mresetuje czcionkę, dzięki czemu reszta tekstu jest normalna.

Wikipedia ma pełną listę kodów ucieczkowych ANSI , których można użyć, jeśli obsługuje je emulator terminala.

Edytować

Aby zapewnić przenośność i czytelność, należy używać tputzamiast kodowania kodów ucieczki na stałe. Jedynym minusem jest to, że tputpodejście nie działa z terminalami, które obsługują kody ANSI, ale mają uszkodzone lub brakujące bazy danych terminfo, ale w takim przypadku zepsute terminfo jest większym problemem, ponieważ wiele aplikacji konsolowych opartych na terminfo może nie działać poprawnie.

Oto przykład tego, co robię w moim .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\] "

Oto jak mogłaby wyglądać moja uogólniona wersja. Jest 0to status wyjścia ostatniego polecenia.

Zrzut ekranu PS1

jw013
źródło
Ładna i wyjaśniająca odpowiedź, +1. Wciąż znalazłem odpowiedź hesse'a bardziej na temat, więc wybrałem ją zamiast tego.
Benjamin
Kiedy spróbowałem, napotkałem problem, taki jak monit terminala niepoprawnie opakowany . Czy ty? Czy zaktualizowałeś sekwencje specjalne?
Stefan Lasiewski
6

To jest domyślny monit wyświetlany w powłoce cygwin bash:

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

wprowadź opis zdjęcia tutaj

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

Referencje:

Stephen Quan
źródło
Fajnie, dodałem nową linię przed [user @ host], dzięki czemu każde polecenie jest jeszcze bardziej czytelne (powinno być ustawione tak domyślnie na terminalu imo).
Benjamin
2

Używam tej funkcji powłoki, aby uzyskać atrybuty tekstu w terminalu:

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
}

Następnie, aby go użyć:

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

Daje mi to, [username@hostname]:cwd>gdzie username@hostnamesą odważne zielone i cwdodważne niebieskie.

Arcege
źródło
Dzięki za to. Przypuszczam, że musiałem również skopiować wszystkie powyższe ~/.bashrc?
Benjamin
Tak, ustawiam to w moim ~/.bashrcpliku i używam go, aby ustawić monit. Nawet zmieniam kolory w zależności od używanego systemu.
Arcege
1

Aby wyglądało jak domyślny monit Ubuntu, dodaj

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

w twoim ~/.bashrc.

Spowoduje to wyświetlenie dobrze znanego zielonego user@host(pogrubionego), a następnie nie pogrubionego białego dwukropka, a następnie katalogu roboczego pogrubioną niebieską czcionką, a następnie $znaku, spacji i polecenia nie pogrubionymi białymi literami:

Podpowiedź Ubuntu Bash

Tobias Feil
źródło