如何编写bash脚本连续监视终端命令?



我想编写一个bash脚本,它可以一直监视终端上输入的命令。如用户在终端上输入rm命令,bash程序会询问用户是否要删除文件,如果输入Y,则执行删除操作。

首先,使用rm,您实际上不需要这样做。如果您希望rm总是提示您,您应该这样做:

rm() { command rm -i "$@"; }

定义了一个函数,每次调用rm时注入-i。(把上面的行放在你的启动文件中,这样它就可以在每个交互式shell中定义。)

但是,bash确实让您能够使用DEBUG陷阱做您(似乎)想做的事情。它是在您交互式输入的每个命令之前执行的函数。例如,要使用您的示例并使用rm提示删除,您可以这样做:

$ debug_trap() { case $BASH_COMMAND in rm*) read -p "Do you really want to rm $@? ";
if test "$REPLY" != Y; then echo aborting; return 1; fi;; esac; } >&2
$ trap debug_trap DEBUG
$ shopt -s extdebug

(extdebug是必要的,这样从trap函数返回非零可以防止命令被执行),但这是荒谬的脆弱。这将可靠地捕获rm的所有调用,并且试图使其健壮几乎肯定注定要失败。