Tonin wies auf einen Fehler in meiner Standardaufforderung hin . Minimales Beispiel:
PS1 einstellen:
PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " ")$ '
Zu diesem Zeitpunkt sieht die Eingabeaufforderung folgendermaßen aus:
$
Lösen Sie nun die Ausgabe des Exit-Codes aus, indem Sie Folgendes ausführen:
false
Jetzt enthält die Eingabeaufforderung den Beendigungscode in rot am Anfang der Zeile:
1 $
- Drücken Sie Ctrl- r.
Geben Sie "false" ein. Jetzt enthält die Eingabeaufforderung nur die Suche:
(reverse-i-search)`false': false
- Drücken Sie Enter.
Die resultierende Terminal-Historie enthält nun Folgendes:
1 $ch)`false': false
Erwartete Ausgabe:
1 $ false
Das heißt, die Ausgabe der Verlaufssuche scheint mit der Eingabeaufforderung gemischt zu sein und den tatsächlich ausgeführten Befehl auszublenden.
Ich habe versucht, dies zu umgehen, indemPROMPT_COMMAND
ich Folgendes verwendete :
set_exit_code() {
exit_code=$?
[[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " "
}
set_bash_prompt() {
PS1='$(set_exit_code)$ ' # Double quotes give the same result
}
PROMPT_COMMAND=set_bash_prompt
Dies scheint nicht zu funktionieren - die Linie sieht nach dem Suchen und Ausführen genauso aus wie zuvor.
Wie kann ich das beheben?
Antworten:
Ich habe die Antwort auf askubuntu.com gefunden . @qeirha erwähnte, dass Sie bash mitteilen müssen, dass die Zeichenfolge nicht in der Länge der Eingabeaufforderung gezählt werden soll, und Sie tun dies, indem Sie sie einschließen
\[
\]
. Anhand des angegebenen Beispiels ist hier eine Lösung:quelle
PS1
Code behoben. Warum habe ich diesen nicht gesehen?(Sorry, keine Erklärung hier. Siehe PS1 richtig anpassen? Oder eine andere Frage zu Problemen bei der Berechnung der Prompt-Länge und
\[
...\]
)quelle
\[...\]
funktioniert, solange Sie den gesamten Code, den Sie für Ihre Eingabeaufforderung generieren möchten, in eine einzige Zeichenfolge schreiben können. Wenn Sie Ihren Code jedoch in kleine Funktionen aufteilen möchten, können Sie die Anfangs- und Endeklammer nicht mehr in dieselbe Zeichenfolge / Funktion setzen. Und das bricht Zeilenumbruch. Es sei denn, Sie verwendenPROMPT_COMMAND
, um IhrePS1
bei jeder Eingabeaufforderung neu zu berechnen .Wenn Sie @manatwork answer erweitern, den Code jedoch
PS1
in verschiedene Funktionen aufteilen , können Sie die Eingabeaufforderung folgendermaßen schreiben:Doppelte Anführungszeichen sind sowohl bei der Einstellung
PS1
als auch bei der Verwendungprintf
in der Funktion obligatorisch .quelle
.bashrc
- schreiben Sie den Code nicht in eine separate Datei und rufen Sie diese auf.