HOWTO zum Bash-Eingabeprompt

(C) 2006-2017 T.Birnthaler/H.Gottschalk <howtos(at)ostc.de>
              OSTC Open Source Training and Consulting GmbH
              www.ostc.de

$Id: bashprompt-HOWTO.txt,v 1.15 2019/11/26 19:37:07 tsbirn Exp $

Dieses Dokument beschreibt die Konfiguration des Bash-Eingabeprompts.

Inhaltsverzeichnis

1) PrimÀrer Prompt PS1
2) Sonderzeichen in Prompt-Variablen
3) Hinweise
4) Weitere Prompt-Variablen PS0, PS2, PS3, PS4

1) PrimÀrer Prompt PS1   (Toc)

Die Variable "PS1" legt das Aussehen des Eingabeprompts (primÀrer Prompt,
Eingabeaufforderung) fest, der immer dann ausgegeben wird, wenn eine interaktive
Shell auf die Eingabe eines Befehls wartet. Standardwert ist:

  PS1="\s-\v\$ "    # Shell-Name "-" Shell-Version, "$" oder "#"(root) Leerz.(!)

Sie wird fÃŒr alle Benutzer gemeinsam in "/etc/profile" (zuerst) oder fÃŒr
einzelne Benutzer in "~/.profile" (Login-Shell) bzw. "~/.bashrc" (interaktive
Shell) gesetzt.

2) Sonderzeichen in Prompt-Variablen   (Toc)

Folgende Sonderzeichen in "PS1" (und den anderen Prompt-Variablen) setzen
spezielle (variable) Komponenten in den Prompt ein:

  +---------+------------------------------------------------------------------+
  | Zeichen | Bedeutung                                                        |
  +---------+------------------------------------------------------------------+
  | \a      | Klingeln [alert]                                                 |
  | \e      | ESC-Zeichen [escape]                                             |
  | \n      | Zeilenumbruch [newline]                                          |
  | \r      | WagenrÃŒcklauf [carriage return]                                  |
  +---------+------------------------------------------------------------------+
  | \d      | Datum in der Form "Sun Dec 24" [date]                            |
  | \D{FMT} | Datum formatiert gemÀß "strftime(3)"-Format FMT [Date]           |
  | \t      | 24h-Zeit in der Form "HH:MM:SS" [time]                           |
  | \T      | 12h-Zeit in der Form "HH:MM:SS" [Time]                           |
  | \A      | 24h-Zeit in der Form "HH:MM"                                     |
  | \@      | 12h-Zeit in der Form "HH:MM AM/PM"                               |
  +---------+------------------------------------------------------------------+
  | \h      | Rechner-Name bis zum ersten "." [host]                           |
  | \H      | VollstÀndiger Rechner-Name (FQHN) [Host]                         |
  | \j      | Anzahl Hintergrundprozesse verwaltet von Shell [jobs]            |
  | \l      | Terminalname (nach letztem "/" --> "tty01" bei "/dev/tty01")     |
  | \u      | Benutzer-Name [user]                                             |
  | \w      | VollstÀndiges Arbeitsverzeichnis [working directory]             |
  | \W      | Arbeitsverzeichnis (Teil nach letztem "/") [Working directory]   |
  +---------+------------------------------------------------------------------+
  | \s      | Shell-Name (basename $0) [shell]                                 |
  | \v      | Bash-Version [version]                                           |
  | \V      | Bash-Version (inkl. Release und Patchlevel) [Version]            |
  +---------+------------------------------------------------------------------+
  | \$      | "$"-Zeichen fÃŒr normalen Benutzer, "#"-Zeichen fÃŒr root          |
  | \#      | Befehlszeilennummer (in aktueller Sitzung)                       |
  | \!      | Befehlszeilennummer (ÃŒber Sitzungen hinweg)                      |
  +---------+------------------------------------------------------------------+
  | \[      | Beginn nicht darstellbare Zeichen (bei KommandolÀnge ignoriert!) |
  | \]      | Ende nicht darstellbare Zeichen (bei KommandolÀnge ignoriert!)   |
  | \\      | Backslash                                                        |
  +---------+------------------------------------------------------------------+

Der Standardwert unter Linux betrÀgt fÌr die root:

  PS1="\h:\w # "      # Host + Arbeitsverzeichnis + "#" + Leerzeichen(!)

und fÃŒr normale Benutzer:

  PS1="\u@\h:\w > "   # User + HOST + Arbeitsverzeichnis + ">" + Leerzeichen(!)

3) Hinweise   (Toc)

* Das Leerzeichen am Prompt-Ende ist wichtig, damit die Kommandoeingabe etwas
  abgesetzt vom Prompt beginnt.

* Der Prompt sollte nicht zu lang sein, da er sonst unÃŒbersichtlich wird und
  zu wenig Platz fÌr die Eingabe der Kommandozeile Ìbrig lÀsst.

* Einen inversen Prompt kann man durch Einsatz des Kommandos "tput" zur
  Ansteuerung von Terminal-Attributen erreichen. Dazu ist die Ausgabe des
  "tput"-Kommandos per Kommando-Substitution `...` (in jeder Shell
  bzw. $(...) in der Bash) in die Prompt-Definition einzufÃŒgen:

    PS1="\[`tput smso`\]\u@\h:\w \! >\[`tput rmso`\] "     # Jede Shell
    PS1="\[$(tput smso)\]\u@\h:\w \! >\[$(tput rmso)\] "   # bash

  "tput smso" schaltet den inversen Modus ein (set mode stand out),
  "tput rmso" schaltet ihn wieder ab (remove mode stand out).

  Damit die von "tput" erzeugten ANSI-Steuersequenzen nicht als Zeichen
  mitgezÀhlt werden, sollten sie in "\[...\]" eingeschlossen werden (werden
  dann ignoriert). Vergisst man diese Klammern, dann lÀsst sich beim Editieren
  eines Kommandos der Cursor nicht mehr richtig mit den Cursortasten steuern.

* Analog lÀsst sich ein farbiger Prompt erzeugen (z.B. "tput setaf 7" = weiße
  Schrift, "tput setab 4" = blauer Hintergrund, "tput sgr0" = normale Schrift):

    PS1="\[`tput setaf 7; tput setab 4`\]\u@\h:\w \!\[`tput sgr0`\] "
    PS1="\[$(tput setaf 7; tput setab 4)\]\u@\h:\w \!\[$(tput sgr0)\] "

* Soll nur der Name des aktuellen Verzeichnisses sichtbar sein (ohne Pfad
  davor), "\W" statt "\w" verwenden:

    PS1="\[`tput smso`\]\u@\h:\W \!\[`tput rmso`\] "
    PS1="\[$(tput smso)\]\u@\h:\W \!\[$(tput rmso)\] "

* Soll der absolute Pfad sichtbar sein, "\$(pwd)" statt "\w" verwendet
  (Kommando-Substitution):

    PS1="\[`tput smso`\]\u@\h:`pwd` \!\[`tput rmso`\] "
    PS1="\[$(tput smso)\]\u@\h:\$(pwd) \!\[$(tput rmso)\] "

* Der Wert der Variable "PROMPT_DIRTRIM" (ganze Zahl > 0) legt fest, wie viele
  Pfadkomponenten vom aktuellen Verzeichnis bei \w und \W ÃŒbrig bleiben sollen.

4) Weitere Prompt-Variablen PS0, PS2, PS3, PS4   (Toc)

* Die Variable "PS0" wird zwischen dem Lesen des eingetippten Kommandos und
  seiner AusfÃŒhrung ausgegeben: Standard ist:

    PS0=""

* Die Variable "PS2" legt das Bereitschaftzeichen fest, das immmer dann
  ausgegeben wird, wenn Return gedrÃŒckt wird, die Shell das (mehrzeilige)
  Kommando aber noch nicht als abgeschlossen betrachtet (z.B. "for VAR in
  WERT1 WERT2 ..." <RETURN>). Standard ist:

    PS2="> "

  HINWEIS: Erscheint ÃŒberhaupt kein Prompt nach der Eingabe von <RETURN>, so
  wartet das aufgerufene Kommando meist auf Eingabe von "stdin". Diese Eingabe
  kann mit <Strg-D> oder "." ABGESCHLOSSEN werden, mit <Strg-C> kann das
  Kommando ABGEBROCHEN werden.

* Die Variable "PS3" steht fÃŒr den Prompt beim "select"-Kommando. Standard ist:

    PS3="#? "

* Die Variable "PS4" wird vor Debug-Meldungen ausgegeben, die durch die
  Shell-Option "-x" [execute trace] ausgelöst werden. Standard ist:

    PS4="+"

* Der Inhalt der Variable "PROMPT_COMMAND" wird jedesmal als Kommando
  ausgefÃŒhrt, bevor ein Eingabe-Prompt angezeigt wird. Die folgende Belegung
  gibt z.B. nach jedem eingegeben Kommando dessen Exit-Status aus.

    PROMPT_COMMAND="echo 'Exit-Status: $?'"