Bash: Woher wissen, ob die Ausgabe des letzten Befehls mit einem Zeilenumbruch endet oder nicht?

10

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]\$ '
GetFree
quelle
Dies sollte in den Superuser verschoben werden.
inkaphink
Ich mag deine Version! Sie haben $()an einem Ort und Backticks an einem anderen verwendet. Sie können $()in beiden verwenden.
Bis auf weiteres angehalten.
Ich kenne. Aber für mich ist es einfacher, so zu lesen
GetFree
Ich würde es nicht verwenden, tput colsweil 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(entspricht tput 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.
dlitz
1
Das Ganze kann wie PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '
folgt

Antworten:

6

Ich habe mit Folgendem experimentiert, um die Funktion zshin Bash zu emulieren :

$ unset PROMPT_SP; for ((i = 1; i <= $COLUMNS + 52; i++ )); do PROMPT_SP+=' '; done
$ PS1='\[\e[7m%\e[m\]${PROMPT_SP: -$COLUMNS+1}\015$ '

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 forAusführung der Schleife noch nicht festgelegt ist ~/.bashrc. Möglicherweise möchten Sie, shopt -s checkwinsizewenn es nicht bereits festgelegt ist.

Bis auf weiteres angehalten.
quelle
Ich frage mich, warum jemand jede Antwort abgelehnt hat . Hmmm ... keine Erklärung. Wie hilfreich.
Bis auf weiteres angehalten.
Hier ist eine andere Möglichkeit, ohne eine Schleife die Pad-Zeichenfolge zu erstellen:printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
Bis auf weiteres angehalten.
Was ist ein "umgekehrtes Video-Prozentzeichen"? Das Wort "Video" hat mich verwirrt und ich konnte die Antwort bei Google nicht finden.
Davidchambers
1
@davidchambers: Der Hintergrund des Zeichens wird in der Vordergrundfarbe und das Zeichen selbst in der Hintergrundfarbe angezeigt. Sehen Sie man 5 terminfonach "Reverse Video" und suchen Sie nach einer Dokumentation, die diese Terminologie verwendet.
Bis auf weiteres angehalten.
0

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_COMMANDsoll, das die aktuelle Position des Cursors überprüft und eine neue Zeile ausgibt, wenn sich der Cursor nicht am linken Rand befindet.

Teddy
quelle
Gute Idee. Das einzige Problem ist ... ist es möglich, die Cursorposition zu kennen?
GetFree
0

zshversucht Ihr Problem zu lösen. Wenn die letzte Ausgabe ohne Zeilenumbruch endet, erhalten Sie:

$ echo -n 'abc'
abc%
$ 

Wo %verwendet invertierter Hintergrund / Vordergrund. Ich bin mir nicht sicher, ob es bashin irgendeiner Weise tragbar ist .

Viraptor
quelle