在Bash中每n个命令执行一次函数

4

我希望制作一个程序,在bash中每n个命令执行一次。例如,我想让用户每在bash中执行5个命令就回答一个问题。

我认为这个功能可以只用bash脚本来实现,但我找不到一个合适的解决方案。我不想编译一个新的bash,我认为这可以通过一个bash脚本来实现。如果是这样,我需要改变bashrc吗?

2个回答

7
你可以使用自定义函数在shell中捕获DEBUG信号。
runcmd() { if (( n==5 )); then n=0; pwd; else ((n++)); fi; }

trap 'runcmd' DEBUG

使用您自定义的命令或脚本替换pwd

  • trap 'handler' DEBUG在运行shell中的每个命令后调用handler但是当仅按下Enter键时不会调用runcmd

编辑:感谢@kojro:您可以将此函数缩短为:

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

2
你仍然可以这样写:runcmd() { (( n++ % 5 )) || pwd; }。 :P - kojiro
如果设置了PROMPT_COMMAND,那么在shell中仅按回车键仍会触发每五行的此命令,因为PROMPT_COMMAND是一个命令。我相信有些读者会发现这很明显,但有些人可能不知道。 - kojiro
(请注意,原始的“runcmd”存在一位差错,并且会执行每六个命令中的一个。) - kojiro
是的 @kojiro:几个月前我遇到了同样的问题,当时我设置了PROMPT_COMMANDtrap DEBUG - anubhava

3
您可以使用PROMPT_COMMAND shell变量,在每次用户命令后(每次显示提示符时)运行一个命令,并在其中使用计数器,以便每隔五次执行一次某些操作:
PROMPT_COMMAND="if [ \"\$HELLO_COUNTER\" -le 0 ]; then HELLO_COUNTER=5; echo 'Hello, world.'; else let --CTR; fi"

编辑:@kojiro 在评论中提出了一个好主意,使用内置的LINENO变量而不是新计数器,如下所示:

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

我很喜欢这个。


谢谢!这正是我想要的! - carpedm20
1
我相信即使您按下空白回车键而没有输入任何命令,PROMPT_COMMAND也会被执行。 - anubhava
使用LINENO变量可能比使用新的、任意的HELLO_COUNTER更合适。 - kojiro
@anubhava 当然,但是PROMPT_COMMAND是一个命令... #stackoverflow - kojiro
3
PROMPT_COMMAND='(( LINENO % 5 )) || echo "every fifth"' - kojiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接