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