Kann ich bash so konfigurieren, dass “ clear ” vor jedem in die Konsole eingegebenen Befehl ausgeführt wird?

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, warum local 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 wird clear; 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 verschoben ls;# kommentiert, was da war, und führt den Befehl ls 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.