Ich möchte bash so konfigurieren, dass der Befehl clear
jedes Mal ausgeführt wird, wenn ich einen Befehl in das Terminal eingebe (vorher) meinen Befehl ausführen). Wie kann ich das machen?
Ich verwende Debian Linux.
Kommentare
- Sie finden dieser Thread ist nützlich.
- Nur neugierig: Welche ' bewerben Sie sich dafür? Außer wenn ich ' Wenn ich Programme mit viel Ausgabe debugge, möchte ich normalerweise so viel wie möglich auf dem Bildschirm behalten, damit ich den Kontext verfolgen kann, den ich ' Ich arbeite in.
Antwort
Bash hat ein Vorbefehlshaken . Art von.
preexec () { clear } preexec_invoke_exec () { [ -n "$COMP_LINE" ] && return # do nothing if completing [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don"t cause a preexec for $PROMPT_COMMAND local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`; # obtain the command from the history, removing the history number at the beginning preexec "$this_command" } trap "preexec_invoke_exec" DEBUG
Kommentare
- Gilles: Ich habe eingefügt Das Obige in ein Konsolenterminal und die Ausgabe von jedem Befehl, den ich anschließend eingegeben habe, wurde gelöscht, bevor ich es lesen konnte. Fehlt mir etwas? Was passiert auch für dieses (und die andere Antwort unten), wenn ich ein mehrzeiliges Bash-Skript aufrufe? wobei mehr als eine Zeile (oder eine andere Zeile als die letzte) inter erzeugt Ausgabe testen?
- @Joe Dies sollte den Bildschirm löschen, nachdem Sie
Enter
gedrückt haben, bevor Sie den Befehl ausführen. Bei mir funktioniert das so. Der preexec-Hook wird für jeden interaktiven Befehl ausgeführt. Es spielt keine Rolle, ob es sich bei dem Befehl um einen integrierten oder einen externen Befehl oder um viele Befehle handelt. - @ Joe, Sie müssen diese Zeile unten hinzufügen, nichts tun, wenn vollständig
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;
das Problem ist, dass PROMPT_COMMAND ausgeführt und auch nach dem eigentlichen Befehl abgefangen wird; Kann mir auch jemand sagen, warumlocal this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
hier ist? - @JamesAndino
history -1
druckt die letzte Befehlszeile mit eine Geschichtsnummer vor. Der sed-Filter entfernt die Verlaufsnummer. - @JamesAndino Damit hat es funktioniert (und ich sehe, dass Giles es seiner Antwort hinzugefügt hat.)
Antwort
bind "RETURN: "\e[1~clear; \e[4~\n""
Danach drücken Sie jedes Mal, wenn Sie drücken, , anstatt nur wird an den Zeilenanfang verschoben, geben Sie den Text clear;
ein, gehen Sie zum Ende und geben Sie \n
wie erwartet.
Kommentare
- Eine neue Zeile bewirkt, dass die Eingabeaufforderung trotzdem gedruckt wird. Wenn Sie also die Klarstellung in die Eingabeaufforderung einfügen, wird dasselbe erreicht ohne den Befehlsverlauf mit
clear
-Befehlen zu verschmutzen. - @ jw013 Der Unterschied besteht darin, dass in meinem Fall
clear
wird ausgeführt, bevor der Befehl und die Befehlsausgabe ' nicht verschwinden. Im Falle einer Eingabeaufforderung ist dies jedoch der Fall. - Ich wünschte, es gäbe eine Möglichkeit, dies zu tun, ohne die Befehlszeile selbst ändern zu müssen – ich ' bin mir sicher, dass dies der Fall ist Unterbrechen Sie interessante oder mehrzeilige Befehle auf interessante Weise, aber ich kann ' keinen besseren Weg finden, dies zu tun.
- @ jw013, Sie haben Recht, es wird für mehrere Zeilen unterbrochen. Für jedes zusätzliche
\n
wirdclear;
in die Ausgabe eingefügt. - Dieser Tipp ist sehr gut danke !! Ich musste einen bestimmten Code an F2 binden, aber manchmal hat die Zeile einen Befehl, den ich eingegeben, aber nicht ausgeführt habe. Mit diesem Beispiel:
bind "\"\\eOQ\":\"\e[1~ls;#\\n\""
wird er an den Anfang verschobenls;#
kommentiert, was da war, und führt den Befehlls
ordnungsgemäß aus! thx!
Antwort
von einer Frage, die ich heute gestellt habe (mit Gutschrift an Benutzer @aecolley ):
bind ""\C-m": "\C-l\C-j""
Die \C-m
Simulation die „Enter“ -Taste, die \C-l
, die Ctrl+l
simuliert, wenn es klar ist, und die \C-j
ist „newline-and-indent“, daher ist der Befehl bindend. Geben Sie die Eingabetaste an Strg + l & Strg + j
ein, die mit GNU bash, Version, funktioniert 3.2.53 (1) -release (x86_64-apple-darwin14) und die anderen Antworten in diesem Thread nicht. Dies verschmutzt auch nicht den Verlauf mit „clear“ -Befehlen bei jedem anderen Befehl.
Kommentare
- Hinweis: Wenn Sie over ssh verwenden, müssen Sie es in dieser Umgebung ausführen, da sonst Verrücktheit auftritt.
- erstellen Sie es funktioniert auf meinem Ubuntu 16.04-Terminal, danke, aber wie funktioniert es? Könnten Sie bitte einen Link oder eine Dokumentation bereitstellen?
Antwort
Betrachten Sie das Löschen nur, wenn Sie
cb4() { preexec () { clear } }
Hierbei wird ein Hook mit dem Namen preexec
verwendet. Bestätigt funktioniert auch mit zsh.
Dann jede Sitzung, die Sie automatisch löschen möchten, vor jedem Befehl, den Sie ausführen : cb4
Wenn Sie sicher sind, dass Sie immer in jedem Kontext löschen möchten
preexec () { clear }
Und wenn Sie das Terminal tatsächlich zurücksetzen möchten
, ersetzen Sie das Wort clear
durch tput reset
tput
ist optional, beschleunigt jedoch den Rücksetzvorgang