Kann ich die bash so konfigurieren, dass sie "clear" vor jedem in die Konsole eingegebenen Befehl ausführt?


22

Ich möchte bash so konfigurieren, dass der clearBefehl jedes Mal ausgeführt wird, wenn ich einen Befehl im Terminal eingebe (bevor ich meinen Befehl ausführe). Wie kann ich das machen?

Ich benutze Debian Linux.


Sie finden diesen Thread nützlich.
Thor

3
Nur neugierig: Was bewerben Sie sich dafür? Außer wenn ich Programme mit viel Ausgabe debugge, möchte ich in der Regel so viel wie möglich auf dem Bildschirm anzeigen, damit ich den Kontext verfolgen kann, in dem ich arbeite.
Joe

Antworten:


22

Bash hat einen Vorkommando-Haken . 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

Gilles: Ich habe das Obige in ein Konsolenterminal eingefügt und die Ausgabe jedes Befehls, den ich anschließend eingegeben habe, wurde gelöscht, bevor ich sie lesen konnte. Vermisse ich etwas? Was passiert für diese (und die andere Antwort unten), wenn ich ein mehrzeiliges Bash-Skript aufrufe, bei dem mehr als eine Zeile (oder eine andere als die letzte Zeile) eine interessante Ausgabe generiert?
Joe

@Joe Dies sollte den Bildschirm löschen, nachdem Sie gedrückt haben Enter, bevor Sie den Befehl ausführen. Bei mir funktioniert das so. Der Preexec-Hook wird für jeden interaktiven Befehl ausgeführt. Dabei spielt es keine Rolle, ob es sich bei dem Befehl um einen integrierten oder einen externen Befehl oder um viele Befehle handelt.
Gilles 'SO- hör auf böse zu sein'

1
@Joe Sie müssen diese Zeile hinzufügen. Tun Sie nichts, wenn [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;das Problem darin besteht, 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?
MageProspero

@JamesAndino history -1druckt die letzte Befehlszeile mit einer Verlaufsnummer voran . Der sed-Filter entfernt die Verlaufsnummer.
Gilles 'SO - hör auf, böse zu sein'

@JamesAndino Damit hat es funktioniert (und ich sehe, Giles hat es zu seiner Antwort hinzugefügt.)
Joe

6
bind 'RETURN: "\e[1~clear; \e[4~\n"'

Danach springt es bei jedem Drücken returnvon \nan den Zeilenanfang, gibt den Text ein clear;, springt dann an das Ende und gibt \nwie erwartet ein.


2
Eine neue Zeile bewirkt, dass die Eingabeaufforderung trotzdem gedruckt wird. Wenn Sie also das Häkchen in der Eingabeaufforderung setzen, geschieht dasselbe, ohne den Befehlsverlauf mit clearBefehlen zu verschmutzen .
Jw013

2
@ jw013 Der Unterschied ist, dass in meinem Fall clearausgeführt wird, bevor der Befehl und die Befehlsausgabe nicht verschwinden. Bei prompt ist dies jedoch der Fall.
Ansturm

Ich wünschte, es gäbe eine Möglichkeit, dies zu tun, ohne die Befehlszeile selbst ändern zu müssen. Ich bin sicher, dass dies bei komplexen oder mehrzeiligen Befehlen auf interessante Weise zu Bruch gehen würde, aber ich kann keinen besseren Weg finden, dies zu tun.
JW013

@jw013, du hast recht, es kommt zu Unterbrechungen bei Mehrzeilen. Es clear;wird für jede zusätzliche Zeile in die Ausgabe eingefügt \n.
Peter.O

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. In bind "\"\\eOQ\":\"\e[1~ls;#\\n\""diesem Beispiel wird der Code an den Anfang verschoben, ls;#kommentiert, was dort war, und der lsBefehl wird ordnungsgemäß ausgeführt! Danke!
Aquarius Power

2

Von einer Frage, die ich heute gestellt habe (mit Gutschrift auf die Antwort von user @ aecolley ):

bind '"\C-m": "\C-l\C-j"'

Das \C-mSimulieren der ' Enter'- Taste, das \C-lSimulieren, Ctrl+lwie es ist, und das \C-jist "Newline-and-Indent", so dass der Befehl die Eingabetaste an Strg + L & Strg + J bindet

das funktioniert auf GNU bash, version 3.2.53 (1) -release (x86_64-apple-darwin14) und die anderen antworten auf diesen thread nicht. Außerdem verschmutzt dies den Verlauf nicht mit Befehlen zum Löschen aller anderen Befehle.


1
Hinweis: Wenn Sie über ssh arbeiten, müssen Sie es in dieser Umgebung ausführen, da es sonst zu merkwürdigen Ergebnissen kommt.
TRB

greate es funktioniert auf meinem ubuntu 16.04 terminal, danke aber wie funktioniert es, könntest du bitte einen link oder eine dokumentation bereitstellen?
Andrzej Rehmann
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.