Як запустити команду перед або після кожної команди, написаної на консолі?


4

Я хочу запустити команду до і після кожної окремої команди, яка виконується в терміналі (тобто clearдо і потім reset). Я хочу, щоб це відбувалося автоматично, а не з коротким псевдонімом або подібним.

Я заглянув у bashrc та / usr / share / bash-завершення / bash_completion, хоча останній, здається, лише для функції автоматичного завершення з Tab?

Де я можу внести свої зміни?


Ви хочете виконати команду перед кожною командою, що буде виконуватися перед цією командою? Тут рекурсія
Anwar

@Anwar Я мав на увазі запуск команди перед кожною командою, написаною в консолі.
Кату

Це хороша можливість перейти на Zsh, який може зробити це на самому собі. У Баша воно вимагає певного розмивання; дивіться superuser.com/questions/175799/…
fkraiem

Також дивіться: unix.stackexchange.com/questions/44713/…
'16

Відповіді:


6

У вашому .bashrc:

function process_command() {
  ... do something with $BASH_COMMAND ...
}
trap process_command DEBUG

Для хорошого прикладу див. " Зробити gnome-terminal показати команду, що працює як заголовок " на AskUbuntu.

Щоб вирішити початковий запит плаката, який потрібно виконати clearперед командою та resetпісля команди, додайте до .bashrc:

function before_command() { 
  case "$BASH_COMMAND" in
        $PROMPT_COMMAND)
          ;;
       *)
          clear;
  esac
}

function before_prompt() { reset ; }

trap before_command DEBUG
PROMPT_COMMAND=before_prompt

У man bashпошуках PROMPT_COMMANDі trap .-lp.


Було б { clear; $BASH_COMMAND; reset; }?
wjandrea

Ні. Прочитайте надане посилання та посібник. Ви не можете виконати $BASH_COMMAND, він надається лише в інформаційних цілях. Те, що запитував оригінальний плакат, можна виконати, очистивши екран у функції, що викликається безпосередньо перед виконанням команди, і скинути термінал у функцію, запущену до виведення запиту. Я відредагував відповідь, щоб навести приклад.
AlexP

@AlexP ваша відповідь корисна, однак я спробував це з командою dateі виявив наступне: Якщо натиснути клавішу Enter, правильно виконується перед_командою та перед_промптом. Однак якщо я напишу команду, lsа потім натисніть клавішу Enter, команда before_command запускається двічі, один раз до і один раз після ls. Команда before_prompt правильно виконується один раз після ls. Я все ще шукаю повне рішення для цього, будь-які поради високо оцінені.
Кату

Функція, встановлена ​​як пастка DEBUG, запускатиметься перед виконанням будь-якої команди, що означає, що вона також запускатиметься перед $ PROMPT_COMMAND. Ви можете перевірити $ BASH_COMMAND, щоб побачити, чи буде команда, яку потрібно виконати, $ PROMPT_COMMAND чи ні.
AlexP
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.