Я хотел бы настроить bash на выполнение clearкоманды каждый раз, когда я набираю какую-либо команду в терминале (перед выполнением моей команды). Как я могу это сделать?
Я использую Debian Linux.
Я хотел бы настроить bash на выполнение clearкоманды каждый раз, когда я набираю какую-либо команду в терминале (перед выполнением моей команды). Как я могу это сделать?
Я использую Debian Linux.
Ответы:
У Bash есть предварительная команда hook . Вроде.
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, прежде чем выполнять команду. Это работает так для меня. Хук preexec выполняется для каждой интерактивной команды, не имеет значения, является ли команда встроенной или внешней командой или многими командами.
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;проблема в том, что PROMPT_COMMAND запускается и также захватывается после фактической команды; Также может кто-нибудь сказать мне, почему local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;здесь?
history -1печатает последнюю командную строку с номером истории впереди. Фильтр sed удаляет номер истории.
bind 'RETURN: "\e[1~clear; \e[4~\n"'
После этого каждый раз, когда вы нажимаете returnвместо простого написания, \nон будет перемещаться в начало строки, вводить текст clear;, затем переходить в конец и вводить, \nкак ожидалось.
clearкоманд командами.
clearвыполняется до того, как команда и вывод команды не исчезает. Однако в случае с подсказкой это так.
clear;в вывод для каждого дополнительного \n.
bind "\"\\eOQ\":\"\e[1~ls;#\\n\""она переместится в начало, напечатает ls;#комментарий, что там было, и lsправильно выполнит команду! Спасибо!
из вопроса, который я задал сегодня (с благодарностью за ответ пользователя @ aecolley ):
bind '"\C-m": "\C-l\C-j"'
\C-mИмитируя клавишу «Enter», то \C-lимитируя , Ctrl+lкак это ясно , и \C-jэто «новая строка-и-отступа», поэтому команда является обязательным Введите ключ Ctrl + L & Ctrl + J
это работает на GNU bash, версия 3.2.53 (1) -релиз (x86_64-apple-darwin14), а другие ответы в этой теме - нет. кроме того, это не загрязняет историю командами «очистки» каждой другой команды.
cb4() {
preexec () {
clear
}
}
Это использует крючок называется preexec, подтвержденные работы с Zsh тоже
Затем любой сеанс, который вы хотите автоматически очистить перед выполнением каждой команды: cb4
preexec () {
clear
}
заменить слово clearнаtput reset
tput не является обязательным, но ускоряет процесс сброса