Запускать скрипт bash каждый раз, когда выполняются командные строки

9

Я новый пользователь Ubuntu / Linux, я хотел бы задать вопрос, как мой заголовок выше.

Например, у меня есть файл bash ./script, я хотел бы, чтобы он запускался автоматически при вводе любой командной строки. Как только я выполню командную строку, pwdто ./scriptбудет выполнена. Как только я наберу следующую командную строку, ls -laто ./scriptснова будет выполнен.

Эндер Фан
источник
4
мы можем спросить: какие действия вы намереваетесь выполнить для каждой набранной команды? и должно ли это быть только для тех, кто набрал в интерактивном режиме? или также для любой команды в скрипте? а как насчет команд, набранных поверх ssh? и т.д. Это может быть проблема XY
Оливье Дюлак

Ответы:

13

Вам нужно установить PROMPT_COMMANDпеременную. От man bash:

PROMPT_COMMAND
              If set, the value is executed as a command prior to
              issuing each primary prompt.

Например, это будет записывать текущую дату при /tmp/PCкаждом выполнении команды:

 $ PROMPT_COMMAND="date > /tmp/PC"
Аркадиуш Драбчик
источник
1
Да, я понял .. довольно классное решение. (голосование одобрено)
Эндер Фан
1
Это не верно. Команда echo $(date)будет запущена во время объявления, поэтому всегда будет показывать (сохранять) одно и то же время.
Heemayl
@heemayl: конечно, ты прав, я исправил это
Аркадиуш Драбчик
@ lộcphan Если один из этих ответов решил вашу проблему, пожалуйста, найдите время и примите его , нажав на флажок слева. Это пометит вопрос как ответивший и выразит благодарность на сайтах Stack Exchange.
тердон
@heemayl: почему? ...
Аркадиуш Драбчик
11

Вы ищете PROMPT_COMMANDпеременную окружения, значение этой переменной будет выполнено как команда, после выполнения каждой команды, заданной в терминале, непосредственно перед отображением следующего приглашения.

Например, установите его как:

export PROMPT_COMMAND='/path/to/script'

Сделайте скрипт /path/to/script, исполняемый первым.

Теперь скрипт будет запускаться после каждой команды.

Просто отметим, что если вы не хотите, чтобы переменная экспортировалась, т.е. делала ее переменной оболочки, а не переменной окружения, отбросьте export:

PROMPT_COMMAND='/path/to/script'

От man bash:

PROMPT_COMMAND 
If set, the value is executed as a command prior to issuing each primary prompt.
heemayl
источник
Я понял, большое спасибо за вашу помощь :) (голосование одобрено)
Ender Phan
Почему вы используете export?
Аркадиуш Драбчик
@ArkadiuszDrabczyk exportсделает переменную переменной PROMPT_COMMANDсреды, т. Е. Переменная будет доступна для всех дочерних процессов (например, подоболочек) текущей оболочки. Если вы просто хотите ограничить его только текущим сеансом оболочки (переменная оболочки), удалите export.
Heemayl
5
@heemayl: IMO exportне является хорошей практикой здесь - PROMPT_COMMANDдолжен быть установлен только в интерактивном файле запуска оболочки и не должны быть видны в среде
Аркадиуш Drabczyk