Могу ли я настроить bash на выполнение команды «очистить» перед каждой командой, набранной в консоли?

22

Я хотел бы настроить bash на выполнение clearкоманды каждый раз, когда я набираю какую-либо команду в терминале (перед выполнением моей команды). Как я могу это сделать?

Я использую Debian Linux.

синтагма
источник
Вы находите эту тему полезной.
Тор
3
Просто любопытно: какое у вас приложение для этого? За исключением случаев, когда я отлаживаю программы с большим количеством вывода, я обычно хочу держать как можно больше на экране, чтобы помочь мне отслеживать контекст, в котором я работаю.
Joe

Ответы:

22

У 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
Жиль "ТАК - перестань быть злым"
источник
Жиль: Я вставил вышеупомянутое в консольный терминал, и выходные данные каждой команды, которую я впоследствии ввел, были очищены прежде, чем я мог прочитать это. Я что-то пропустил? Кроме того, что произойдет для этого (и другого ответа ниже), если я вызову многострочный сценарий bash, где более одной строки (или любой строки, кроме последней) генерирует интересный вывод?
Джо
@Joe Это должно очистить экран после нажатия Enter, прежде чем выполнять команду. Это работает так для меня. Хук preexec выполняется для каждой интерактивной команды, не имеет значения, является ли команда встроенной или внешней командой или многими командами.
Жиль "ТАК - перестань быть злым"
1
@ Джо, вам нужно добавить эту строку ниже, ничего не делайте, если закончите, [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;проблема в том, что PROMPT_COMMAND запускается и также захватывается после фактической команды; Также может кто-нибудь сказать мне, почему local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;здесь?
MageProspero
@JamesAndino history -1печатает последнюю командную строку с номером истории впереди. Фильтр sed удаляет номер истории.
Жиль "ТАК - перестань быть злым"
@JamesAndino Это заставило это работать (и я вижу, что Джайлс добавил это к своему ответу.)
Джо
6
bind 'RETURN: "\e[1~clear; \e[4~\n"'

После этого каждый раз, когда вы нажимаете returnвместо простого написания, \nон будет перемещаться в начало строки, вводить текст clear;, затем переходить в конец и вводить, \nкак ожидалось.

порыв
источник
2
Новая строка приводит к тому, что приглашение в любом случае будет напечатано, поэтому установка в приглашении значения clear выполняет то же самое, не загрязняя историю clearкоманд командами.
jw013
2
@ jw013 Разница в том, что в моем случае clearвыполняется до того, как команда и вывод команды не исчезает. Однако в случае с подсказкой это так.
Раш
Хотелось бы, чтобы был какой-то способ сделать это без изменения самой командной строки - я уверен, что это может сломаться интересными способами для сложных или многострочных команд, но я не могу найти лучшего способа сделать это.
jw013
@ jw013, вы правы, он разбивается на несколько строк. Он вставляет clear;в вывод для каждого дополнительного \n.
Peter.O
этот совет очень хороший THX! Мне нужно было привязать какой-то определенный код к F2, но иногда в строке есть какая-то команда, которую я набрал, но не выполнил, поэтому с помощью этого примера: bind "\"\\eOQ\":\"\e[1~ls;#\\n\""она переместится в начало, напечатает ls;#комментарий, что там было, и lsправильно выполнит команду! Спасибо!
Водолей Сила
2

из вопроса, который я задал сегодня (с благодарностью за ответ пользователя @ 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), а другие ответы в этой теме - нет. кроме того, это не загрязняет историю командами «очистки» каждой другой команды.

TRB
источник
1
примечание: если вы используете over ssh, вы должны выполнить его в этой среде, иначе случится странность.
TRB
Отлично, это работает на моем терминале Ubuntu 16.04, спасибо, но как это работает, не могли бы вы предоставить ссылку или некоторую документацию, пожалуйста?
Анджей Реманн
0

Рассматривайте только очистку, когда вы хотите

cb4() {
  preexec () {
    clear
  }
}

Это использует крючок называется preexec, подтвержденные работы с Zsh тоже

Затем любой сеанс, который вы хотите автоматически очистить перед выполнением каждой команды: cb4

Если вы уверены, что вы всегда хотите очистить в каждом контексте

preexec () {
  clear
}

А если вы действительно хотите сбросить настройки терминала

заменить слово clearнаtput reset

tput не является обязательным, но ускоряет процесс сброса

jasonleonhard
источник