Ändern der Farben für Benutzer-, Host- und Verzeichnisinformationen in der Eingabeaufforderung des Terminals

104

Ist es möglich, die Farben in der Eingabeaufforderung für die Eingabeaufforderung user@computersowie das aktuelle Verzeichnis und die Befehlsteile der Eingabeaufforderungsanzeige zu ändern ?

Ich habe schon so etwas von OSX-Benutzern gesehen, aber ich weiß nicht, wie ich dasselbe im Gnome-Terminal machen soll (ich kann nur die Vordergrund- und Hintergrundfarben ändern).

Dies ist sehr nützlich, wenn Sie beispielsweise versuchen, fehlerhafte Programme zu kompilieren, da lange, unformatierte Nachrichten es schwierig machen, zu unterscheiden, welche Zeilen Befehle sind und welche ausgegeben werden.

Farben im Osx-Terminal

Luiz Rodrigo
quelle
1
Sie suchen nach bashEinstellungen (oder Einstellungen für Ihre bevorzugte Shell), nicht nach Gnome Terminal.
Scott Severance

Antworten:

135

Sie können die Einstellungen Editieren der Datei bearbeiten: ~/.bashrc.

  1. Öffnen Sie die Datei: gedit ~/.bashrc.

  2. Suchen Sie die Zeile mit #force_color_prompt=yesund entfernen Sie das Kommentarzeichen (löschen Sie das #).

  3. Suchen Sie nach der Zeile darunter if [ "$color_prompt" = yes ]; then, die wie folgt aussehen sollte:

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

    Achten Sie auf den Teil \u@\hmit der Aufschrift "user @ host" und die Nummer davor, \[\033[01;32m\]die die Farbe angibt. Das musst du ändern. Beispiel: Ändern Sie den Benutzer in "Lila", das "@" in "Schwarz" und den Host in "Grün". Bearbeiten Sie die Zeile so, dass sie wie folgt aussieht:

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

Ergebnis:
Bildbeschreibung hier eingeben

Die Farbnummern sind:

Schwarz 0; 30 Dunkelgrau 1; 30
Blau 0; 34 Hellblau 1; 34
Grün 0; 32 Hellgrün 1; 32
Cyan 0; 36 Helles Cyan 1; 36
Rot 0; 31 Hellrot 1; 31
Lila 0; 35 Helllila 1; 35
Braun 0; 33 Gelb 1; 33
Hellgrau 0; 37 Weiß 1; 37

Referenzen: 1 , 2 .

desgua
quelle
Ich bin froh, dass es funktioniert. Herzlich willkommen.
Desgua
Es ist auch erwähnenswert, dass Sie die Farbe Palettedes Terminals nicht ändern sollten , Preferencesbevor Sie dies versuchen, da dies eine Menge Verwirrung mit den Farbcodes verursachen wird.
Rifaz Nahiyan
Aber wie können wir einen bestimmten String so gestalten, dass er in einer bestimmten Farbe erscheint? Wie gesagt, es gibt eine Fehlermeldung, die in einem bestimmten Format gedruckt wird, das ich in roter Farbe sehen möchte. ODER Wenn in GDB eine Meldung wie "Warnung: Quelldatei ist aktueller als ausführbar" angezeigt wird, soll diese in roter Farbe angezeigt werden. Wie kann das erreicht werden?
Darshan L
36

Sie können den BashrcGenerator ausprobieren . Dies ist bei weitem der einfachste Weg, eine Aufforderung zu erhalten, wie Sie möchten. Ich habe festgestellt, dass die hier definierten Farben möglicherweise von Ihrem eigenen System abweichen, aber das ist ein kleines Problem. Mit dem generierten Code können Sie die Farben selbst ändern.

Serverbenutzer:

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

Server root:

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

Bei Bedarf können Sie die Hostnamenfarbe ändern, um die verschiedenen Servertypen widerzuspiegeln.

Ich verwende ein anderes Format für meinen lokalen Computer:

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

Mein Favorit jetzt:

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

Diese letzte Aufforderung hat eine nette Geste. Nach der Eingabeaufforderung wird eine neue Zeile und davor eine leere neue Zeile eingefügt. Jetzt können Sie problemlos den vollständigen Verzeichnispfad anzeigen und bei langer Ausgabe besser erkennen, wo ein neuer Befehl beginnt.

SPRBRN
quelle
5
PS1-Generator: +1: D
anishsane
1
Sehr, sehr gut gefallen hat der letzte, ich war besorgt, weil der Benutzername und der Pfad viel Platz in
Anspruch nahmen
Das hat super geklappt! Wie kann ich dies jedoch für bestimmte Hosts tun? dh ein bestimmtes Farbschema einstellen, wenn ich zum Beispiel in einen Produktionsserver ssh? muss ich das "manuell" mit if-fi blocks in .bashrc machen? oder gibt es einen eleganteren weg?
Acapulco
Verfügen Sie auf jedem Host, auf dem Sie sich anmelden, über eine persönliche .bashrc-Datei für diesen Remotebenutzer, die Sie ändern können. Wenn Sie root werden, hat dies seine eigenen Einstellungen, die andere Benutzer sehen, wenn sie root werden.
SPRBRN
6

Einzelheiten finden Sie in diesem detaillierten HOWTO .

Kurz gesagt, Sie können die Eingabeaufforderung ändern, indem Sie die Umgebungsvariable $ PS1 bearbeiten. Es gibt so viel zu sagen, dass ich Ihnen nur meine Eingabeaufforderung zeigen und Sie auf den obigen Link verweisen werde, um weitere Details zu erfahren.

Die farbbezogenen Teile sind in der Funktion 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

Neben den Farben verfügt meine Eingabeaufforderung über einige weitere Funktionen, z. B. abgekürzte Verzeichnisnamen (siehe Funktion bash_prompt_shortener), automatische Anzeige des Beendigungsstatus des letzten Befehls, wenn dieser nicht Null ist (Funktion checkExitStatus) und Anzeige der Uhrzeit in den Spalten ganz rechts (Funktion print_prompt_time). .

Scott Severance
quelle
Vielen Dank, dass Sie Ihre benutzerdefinierten Funktionen freigegeben haben :) Verschwindet der Zeitstempel nur bei mir, wenn ich die Rücktaste drücke?
Luiz Rodrigo
Nee. Ich auch. Es gibt einen Fehler, den ich als nicht wichtig genug eingeschätzt habe, um ihn zu beheben.
Scott Severance