Wenn Sie drücken Ctrl+L
, macht es teilweise, was Sie wollen. Die aktuelle Zeile wird neu gezeichnet, einschließlich aller Eingaben, die Sie bis zu diesem Punkt eingegeben haben, einschließlich der Cursorposition. Der Bildschirm wird jedoch gelöscht, sodass Ihre vorherige Ausgabe verloren geht (oder bei einem Terminalfenster im Scrollback-Puffer). Auf der anderen Seite waren Sie bereit zu versuchen clear
, also ist das vielleicht kein Problem.
Gibt es einen Befehl, damit bash eine neue Eingabeaufforderungszeichenfolge druckt und die aktuelle Zeile neu zeichnet?
Anstatt auf langsame Befehle zu warten, möchte ich sie im Hintergrund ausführen. Wenn sie jedoch fertig sind und nach stdout drucken, erhalte ich (wo █
mein Cursor steht) Folgendes:
$ slowcmd & $ cmd_output █
- Vor meinem Cursor befindet sich keine Eingabeaufforderung.
- und
slowcmd
kann ein beliebiger langsamer Befehl sein (für das, was ich versucht habe, sagte ich geradealias slowcmd='sleep 1 && echo cmd_output'
)
Wobei mir so etwas gefallen würde:
$ slowcmd && redrawPromptString & $ cmd_output $ █
Wo nach der Ausgabe des Befehls wird ein neuer Prompt String für mich ausgedruckt.
Was kann ich tun, um das zu redrawPromptString
tun, was ich will? Ich habe versucht clear
, kill $$
eine ^C
an das Terminal zu schicken, und schließlich printf "^C"
(natürlich hat das nicht funktioniert). Ich laufe Bash. (GNU bash, Version 3.2.57).
2 Antworten auf die Frage
Verwenden Sie die eingebaute redraw-current-line
Funktion bind
. Zuerst prüfen, ob es vielleicht schon gebunden ist:
bind -q redraw-current-line
Ich habe es noch nie standardmäßig gesehen, daher müssen Sie es wahrscheinlich binden. Wählen Sie eine Tastenkombination aus, sagen wir Ctrl+ Y. Prüfen Sie, ob es bereits vergeben ist:
bind -p | grep -F '"\C-y'
Leere Ausgabe bedeutet, dass die Kombination nicht verwendet wird. Wenn ja, lass uns daran binden redraw-current-line
:
bind "\C-y":redraw-current-line
Wenn jetzt ein Hintergrundprozess Ihre Befehlszeile durcheinander bringt, drücken Sie Ctrl+ Y. Dann wird Ihre Eingabeaufforderung zusammen mit dem Befehl, den Sie nur teilweise eingegeben haben (falls vorhanden), neu gezeichnet, sodass Sie fortfahren können, als ob nichts passiert wäre.
Um die Bindung dauerhaft zu machen, können Sie den obigen Befehl zu Ihrem Befehl hinzufügen ~/.bashrc
, aber nicht. Der richtige Ansatz ist zu ändern ~/.inputrc
(für Benutzer) oder /etc/inputrc
(systemweit). Auf diese Weise readline(3)
gehorcht jedes Programm, das eine Bibliothek verwendet . Die Zeile, die zu einer Datei hinzugefügt werden soll, sieht folgendermaßen aus:
"\C-y":redraw-current-line
Wenn Sie jedoch ~/.inputrc
neu erstellen, vergewissern Sie sich, dass in der ersten Zeile Folgendes angezeigt wird $include /etc/inputrc
. Dies liegt daran, dass dies bis zu diesem Zeitpunkt readline
verwendet wurde /etc/inputrc
und Ihr Workflow möglicherweise auf den Inhalt dieser Datei angewiesen ist. Von jetzt an verwendet die Bibliothek ~/.inputrc
stattdessen Ihre . Die Zeile $include /etc/inputrc
bewirkt, dass die systemweite Datei ebenfalls analysiert wird.
Weitere Informationen finden Sie unter help bind
und man 3 readline
.
Verwandte Probleme
-
1
Pausieren Sie alle Aufgaben außer x CPU-intensiven Aufgaben
-
6
Welche zsh-Funktionen verwenden Sie?
-
5
Transparente Eingabeaufforderung in Vista?
-
4
Verwenden Sie den Windows-Aktenkoffer von der Befehlszeile aus
-
4
Warum sind einige Befehle nicht vorhanden?
-
11
Gibt es eine einfache Möglichkeit, MP3-Dateien zu teilen?
-
2
Wie kann ich OSX Terminal.app dazu bringen, den Vollbildmodus zu öffnen und nicht zu kaskadieren?
-
4
Remote-Ordner unter Linux synchronisieren
-
6
Vollbild-Vista-Eingabeaufforderung oder Ersatz
-
10
Wie kann ich die Bash-Historie durchsuchen und einen Befehl erneut ausführen?