Meistens endet die Ausgabe eines Befehls mit dem Zeilenumbruchzeichen. Manchmal ist dies jedoch nicht der Fall, sodass die nächste Shell-Eingabeaufforderung zusammen mit der Ausgabe in derselben Zeile gedruckt wird.
Beispiel:
root @ hostname [~] # echo -n hallo
helloroot @ hostname [~] #
Ich fand das immer sehr nervig.
Jetzt könnte ich einfach ein "\ n" am Anfang der PS1-Variablen hinzufügen, aber die meiste Zeit wird eine zusätzliche Zeile gedruckt, die ich nicht benötige.
Ist es möglich zu wissen, ob die Ausgabe des letzten Befehls mit einem Zeilenumbruch endete oder nicht?
Lösung:
(Danke an Dennis)
PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '
$()
an einem Ort und Backticks an einem anderen verwendet. Sie können$()
in beiden verwenden.tput cols
weil es sowieso nur den Wert der COLUMNS-Variablen ausgibt, und es ist langsamer, weil es keine eingebaute Shell ist. Sie möchten auch einfügen\e[K
(entsprichttput el
), um das eingefügte Leerzeichen zu löschen, damit beim Kopieren und Einfügen im Standardfall keine nachgestellten Leerzeichen angezeigt werden. Schließlich müssen Sie all diese Magie zwischen\[
und einschließen,\]
sonst versucht bash, Ihre Cursorposition zu erraten, und es wird durcheinander kommen, wenn Sie Ihren Befehl / Verlauf bearbeiten.PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '
Antworten:
Ich habe mit Folgendem experimentiert, um die Funktion
zsh
in Bash zu emulieren :Es wird ein umgekehrtes Video-Prozentzeichen ausgegeben, gefolgt von einer Reihe von Leerzeichen, damit es in die nächste Zeile umgebrochen wird, dann ein Wagenrücklauf, gefolgt von einem Dollarzeichen und einem Leerzeichen. Sie können nach "\ 015" Escape-Escapezeichen hinzufügen, um Ihre Eingabeaufforderung anzupassen.
Die Verwendung hängt davon ab, wie Ihr Terminal mit dem Zeilenumbruch am rechten Rand umgeht (automatische Ränder). Die Länge von PROMPT_SP ist beliebig, sollte jedoch mindestens 80 betragen oder unabhängig von Ihrer üblichen Terminalbreite. Möglicherweise müssen Sie diesen Wert fest codieren, wenn $ COLUMNS zum Zeitpunkt der
for
Ausführung der Schleife noch nicht festgelegt ist~/.bashrc
. Möglicherweise möchten Sie,shopt -s checkwinsize
wenn es nicht bereits festgelegt ist.quelle
printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
man 5 terminfo
nach "Reverse Video" und suchen Sie nach einer Dokumentation, die diese Terminologie verwendet.Nein, das ist nicht möglich. Bash selbst verarbeitet oder sieht die Ausgabe des gestarteten Programms nicht.
Mir ist gerade eingefallen, dass es möglich sein könnte , ein Programm zu schreiben, auf das gesetzt werden
PROMPT_COMMAND
soll, das die aktuelle Position des Cursors überprüft und eine neue Zeile ausgibt, wenn sich der Cursor nicht am linken Rand befindet.quelle
zsh
versucht Ihr Problem zu lösen. Wenn die letzte Ausgabe ohne Zeilenumbruch endet, erhalten Sie:Wo
%
verwendet invertierter Hintergrund / Vordergrund. Ich bin mir nicht sicher, ob esbash
in irgendeiner Weise tragbar ist .quelle