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
(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.
PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '