2015-01-24 3 views
4

Я хотел бы сделать программу, которая будет выполняться каждые n команд в bash. Например, я хочу, чтобы пользователь отвечал на вопрос для каждых 5 команд в bash.Выполнять функцию каждые n команд в bash

Я думаю, что эта функция может быть реализована с использованием только сценария bash, если я не смогу найти подходящее решение для этого. Я не хочу компилировать новый bash, и я думаю, что это можно сделать с помощью сценария bash. Если это так, мне нужно изменить bashrc?

ответ

7

Вы можете уловить DEBUG сигнал в оболочке с пользовательской функцией.

runcmd() { if ((n==5)); then n=0; pwd; else ((n++)); fi; } 

trap 'runcmd' DEBUG 

Изменить pwd с помощью своей команды или скрипта.

  • trap 'handler' DEBUG называет handler после выполнения каждой команды в оболочке , но не будет вызывать runcmd когда просто введите прессуют в оболочке.

Edit: Благодаря @kojro: вы можете сократить эту функцию:

runcmd() { ((n++ % 5)) || pwd; } 
+2

Вы все равно можете записать его' runcmd() {((n ++% 5)) || PWD; } '. : P – kojiro

+0

Спасибо @kojiro, это даже приятнее. Позвольте мне изменить. – anubhava

+0

Если задано 'PROMPT_COMMAND', то нажатие только в командной строке все равно будет запускать эту пятую _line_, так как команда' PROMPT_COMMAND' является командой. Я уверен, что некоторые читатели найдут это очевидным, но некоторые могут этого не сделать. – kojiro

3

Вы можете использовать переменную PROMPT_COMMAND оболочки для запуска команды после каждой команды пользователя (каждый раз, когда отображается подсказка) и использовать счетчик в том, чтобы получить что-то, чтобы выполнить каждый пятый раз:

PROMPT_COMMAND="if [ \"\$HELLO_COUNTER\" -le 0 ]; then HELLO_COUNTER=5; echo 'Hello, world.'; else let --CTR; fi" 

EDIT : @kojiro имеет хорошее представление в комментариях, чтобы использовать встроенную LINENO переменную вместо нового счетчика, как в

PROMPT_COMMAND='((LINENO % 5)) || echo "Hello world."' 

мне нравится это.

+0

Спасибо! Это то, что я хотел! – carpedm20

+1

Я считаю, что 'PROMPT_COMMAND' выполняется, даже если вы нажмете пустой ввод без ввода какой-либо команды. – anubhava

+0

Возможно, более целесообразно использовать переменную LINENO, чем новый, произвольный HELLO_COUNTER. – kojiro

Смежные вопросы