Чи можу я налаштувати bash для виконання "clear" перед кожною командою, введеною на консолі?


22

Я хотів би налаштувати bash для виконання clearкоманди кожного разу, коли я набираю якусь команду в терміналі (перед виконанням моєї команди). Як я можу це зробити?

Я використовую Debian Linux.


Ви вважаєте цю нитку корисною.
Тор

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

Відповіді:


22

Bash має попередній гачок . Типу.

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: я вставив вище в термінал konsole, і вихід з кожної команди, яку я згодом вводив, очищався, перш ніж я міг прочитати його. Я щось пропускаю? Крім того, що станеться для цього (та іншої відповіді нижче), якщо я викликаю багаторядковий скрипт bash, де більше одного рядка (або будь-який рядок, окрім останнього) генерує цікавий вихід?
Джо

@Joe Це слід очистити екран після натискання Enter, перш ніж виконати команду. Це працює для мене так. Гак preexec виконується для кожної інтерактивної команди, не має значення, чи є команда вбудованою чи зовнішньою командою чи багатьма командами.
Жил "ТАК - перестань бути злим"

1
@Joe вам потрібно додати цей рядок внизу, нічого не робити, якщо [ "$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команд командами.
jw013

2
@ jw013 Різниця полягає в тому, що в моєму випадку clearвиконується до того, як вихід команд і команд не зникне. Однак у разі оперативного підключення це робить.
пік

Мені б хотілося, щоб це було можливо, не змінюючи сам командний рядок - я впевнений, що це може зламатись цікавими способами на складних або багаторядкових командах, але я не можу знайти кращого способу зробити це.
jw013

@ jw013, ти маєш рацію, він робить перерву для багаторядкових рядків. Він вставляється clear;до виходу для кожного додаткового \n.
Пітер.О

ця порада дуже хороший 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) -release (x86_64-apple-darwin14), а інших відповідей на цю тему немає. Крім того, це не забруднює історію за допомогою "чітких" команд для будь-якої іншої команди.


1
зауважте: якщо ви користуєтеся над ssh, ви повинні виконати його в тому середовищі, або якщо трапляється дивацтво.
TRB

смачно це працює на моєму терміналі ubuntu 16.04, спасибі, але як це працює, ви можете надати посилання або будь-яку документацію, будь ласка?
Анджей Реманн

0

Подумайте про очищення лише тоді, коли цього захочете

cb4() {
  preexec () {
    clear
  }
}

Для цього використовується гачок, що називається preexec, підтверджена робота і з zsh

Потім будь-який сеанс, який ви хочете автоматично очистити перед кожною командою, яку ви запускаєте: cb4

Якщо ви впевнені, ви завжди хочете зрозуміти в будь-якому контексті

preexec () {
  clear
}

І якщо ви насправді хочете скинути термінал

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

tput необов’язково, але прискорює процес скидання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.