Ich möchte bash so konfigurieren, dass der clear
Befehl 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.
Ich möchte bash so konfigurieren, dass der clear
Befehl 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.
Antworten:
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
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.
[ "$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?
history -1
druckt die letzte Befehlszeile mit einer Verlaufsnummer voran . Der sed-Filter entfernt die Verlaufsnummer.
bind 'RETURN: "\e[1~clear; \e[4~\n"'
Danach springt es bei jedem Drücken returnvon \n
an den Zeilenanfang, gibt den Text ein clear;
, springt dann an das Ende und gibt \n
wie erwartet ein.
clear
Befehlen zu verschmutzen .
clear
ausgeführt wird, bevor der Befehl und die Befehlsausgabe nicht verschwinden. Bei prompt ist dies jedoch der Fall.
clear;
wird für jede zusätzliche Zeile in die Ausgabe eingefügt \n
.
bind "\"\\eOQ\":\"\e[1~ls;#\\n\""
diesem Beispiel wird der Code an den Anfang verschoben, ls;#
kommentiert, was dort war, und der ls
Befehl wird ordnungsgemäß ausgeführt! Danke!
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-m
Simulieren der ' Enter'- Taste, das \C-l
Simulieren, Ctrl+l
wie es ist, und das \C-j
ist "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.