Der Unterschied besteht darin, dass PS1 die tatsächliche Eingabeaufforderungszeichenfolge und PROMPT_COMMAND ist ein Befehl, der unmittelbar vor der Eingabeaufforderung ausgeführt wird. Wenn Sie die einfachste und flexibelste Methode zum Aufbau einer Eingabeaufforderung wollen, versuchen Sie dies:
Setzen Sie diese in Ihre .bashrc:
function prompt_command {
export PS1=$(~/bin/bash_prompt)
}
export PROMPT_COMMAND=prompt_command
Dann ein Skript schreiben (bash, perl, Rubin: Wahl), und platziere es in ~/bin/bash_prompt.
Das Skript kann beliebige Informationen verwenden, um eine Eingabeaufforderung zu erstellen. Dies ist IMO viel einfacher, weil Sie die etwas barocke Ersatzsprache, die nur für die PS1-Variable entwickelt wurde, nicht lernen müssen.
Sie könnten denken, dass Sie dasselbe tun könnten, indem Sie einfach PROMPT_COMMAND direkt auf ~/bin/bash_prompt setzen und PS1 auf die leere Zeichenfolge setzen. Das scheint zunächst zu funktionieren, aber Sie werden bald feststellen, dass der readline-Code erwartet, dass PS1 auf die tatsächliche Eingabeaufforderung gesetzt wird, und wenn Sie in der Historie Backwards scrollen, werden die Dinge dadurch durcheinander gebracht. Diese Problemumgehung verursacht, dass PS1 immer die letzte Eingabeaufforderung widerspiegelt (da die Funktion die tatsächliche PS1, die von der aufrufenden Instanz der Shell verwendet wird, festlegt), und dies bewirkt, dass die Readline und der Befehlshistorie funktionieren.
Sie können eine Ihrer Zeilen verkürzen: 'if git branch &>/dev/null; dann \ '. Es leitet sowohl stdout als auch stderr nach/dev/null um. http://www.tldp.org/LDP/abs/html/io-redirection.html –
Es besteht keine Notwendigkeit, * 'PROMPT_COMMAND' zu exportieren. – dolmen
Ich denke, dass der Kommentar von ceving auch für diese Antwort sehr zutreffend ist: 'Setze PS1 nicht in PROMPT_COMMAND! Setze Variablen in PROMPT_COMMAND und verwende sie in PS1' – Blauhirn