Zmiana kolorów dla informacji o użytkowniku, hoście, katalogu w wierszu polecenia terminala

104

Czy można zmienić kolory w wierszu polecenia dla user@computer, a także bieżącego katalogu i części poleceń wyświetlanych w wierszu polecenia?

Widziałem już coś takiego zrobionego przez użytkowników OSX, ale nie wiem, jak to zrobić w terminalu gnome (mogę zmieniać tylko kolory pierwszego planu i tła).

Byłoby to bardzo przydatne, gdy na przykład próbujesz kompilować programy, które zawierają błędy, ponieważ długie, niesformatowane komunikaty utrudniają rozróżnienie, które wiersze są poleceniami, a które wyjściowymi.

Kolory w terminalu osx

Luiz Rodrigo
źródło
1
Szukasz bashustawień (lub ustawień preferowanej powłoki), a nie Gnome Terminal.
Scott Severance

Odpowiedzi:

135

Można zmienić ustawienia edycję pliku: ~/.bashrc.

  1. Otwórz plik: gedit ~/.bashrc.

  2. Poszukaj linii z #force_color_prompt=yesi odkomentuj (usuń #).

  3. Poszukaj poniższej linii, if [ "$color_prompt" = yes ]; thenktóra powinna wyglądać:

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

    Zwróć uwagę na część \u@\h„użytkownik @ host” i liczbę przed \[\033[01;32m\]wskazaniem koloru. To musisz zmienić. Na przykład, zmień użytkownika na fioletowy, „@” na czarny, a host na zielony. Edytuj linię, aby wyglądała następująco:

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

Wynik:
wprowadź opis zdjęcia tutaj

Numery kolorów to:

Czarny 0; 30 Ciemnoszary 1; 30
Niebieski 0; 34 Jasnoniebieski 1; 34
Zielony 0; 32 Jasnozielony 1; 32
Cyjan 0; 36 Jasny cyjan 1; 36
Czerwony 0; 31 Jasnoczerwony 1; 31
Fioletowy 0; 35 Jasny fioletowy 1; 35
Brązowy 0; 33 Żółty 1; 33
Jasnoszary 0; 37 Biały 1; 37

Odniesienia: 1 , 2 .

desgua
źródło
Cieszę się, że to działa. Witamy.
desgua
Warto również wspomnieć, że nie powinieneś zmieniać koloru Palettez terminala Preferencesprzed wypróbowaniem tego, ponieważ spowoduje to wiele nieporozumień z kodami kolorów.
Rifaz Nahiyan
Ale w jaki sposób możemy stworzyć konkretny ciąg znaków, aby wyświetlał się w określonym kolorze? Powiedzmy, że jest komunikat o błędzie, który jest drukowany w określonym formacie, który chcę zobaczyć w kolorze czerwonym. LUB W GDB, gdy widzę komunikat typu „ostrzeżenie: plik źródłowy jest nowszy niż plik wykonywalny.”, Chcę, aby był wyświetlany w kolorze czerwonym. Jak można to osiągnąć?
Darszan L
36

Możesz wypróbować BashrcGenerator . Jest to zdecydowanie najłatwiejszy sposób na uzyskanie monitu tak, jak chcesz. Zauważyłem, że zdefiniowane tutaj kolory mogą różnić się od twojego własnego systemu, ale to niewielki problem. Za pomocą wygenerowanego kodu możesz samodzielnie zmieniać kolory.

Użytkownik serwera:

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

Katalog główny serwera:

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

W razie potrzeby możesz zmienić kolor nazwy hosta, aby odzwierciedlić inny typ serwerów.

Używam innego formatu dla mojego komputera lokalnego:

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

Mój ulubiony teraz:

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$ "

Ta ostatnia zachęta ma jeden miły akcent. Dodaje nową linię po znaku zachęty i pustą nową linię wcześniej. Teraz możesz bez problemu wyświetlić pełną ścieżkę do katalogu, a to wyjaśnia, gdzie zaczyna się nowe polecenie, w przypadku długich danych wyjściowych.

SPRBRN
źródło
5
Generator PS1: +1: D
anishsane
1
naprawdę bardzo podobał mi się ostatni, martwiłem się, ponieważ nazwa użytkownika i ścieżka zajęły mi dużo miejsca, z ostatnią opcją można uzyskać cały ekran
Damián Rafael Lattenero
To działało świetnie! jak jednak mogę to zrobić dla określonych hostów? tj. ustawić konkretny schemat kolorów, gdy na przykład ssh na serwerze produkcyjnym? czy muszę to robić „ręcznie” z blokami if-fi w .bashrc? czy jest bardziej elegancki sposób?
Acapulco
Na każdym logowanym hoście miej osobisty plik .bashrc dla tego zdalnego użytkownika i możesz go zmienić. Jeśli zostaniesz rootem, będzie to miało własne ustawienia, które będą widoczne dla innych użytkowników, jeśli zostaną rootem.
SPRBRN
6

Aby uzyskać szczegółowe informacje, zobacz to szczegółowe HOWTO .

Krótko mówiąc, możesz zmienić monit, edytując zmienną środowiskową $ PS1. Jest tu tak wiele do powiedzenia, że ​​po prostu pokażę ci mój monit i odsyłam do powyższego linku, aby uzyskać więcej szczegółów.

Części związane z kolorem są w funkcji 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

Oprócz kolorów mój monit ma kilka innych funkcji, takich jak skrócone nazwy katalogów (patrz funkcja bash_prompt_shortener), automatyczne wyświetlanie statusu wyjścia ostatniego polecenia, jeśli niezerowe (funkcja checkExitStatus) oraz wyświetlanie czasu w kolumnach po prawej stronie (funkcja print_prompt_time) .

Scott Severance
źródło
Dziękujemy za udostępnienie niestandardowych funkcji :) Czy tylko ze mną znacznik czasu znika po naciśnięciu klawisza Backspace?
Luiz Rodrigo,
Nie. Ja też. Jest jakiś błąd, który nie uznałem za wystarczająco ważny, aby spróbować go naprawić.
Scott Severance,