Answers:
您是否希望它在不输入额外命令的情况下工作,例如
$ rm file
或仅在用户键入类似内容时
$ confirm rm file
或仅当用户尝试运行某些命令时,例如
$ rm file
但不是
$ echo "Hello"
如果为选项1,则可以使用zsh中的preexec挂钩或bash中的DEBUG陷阱来完成。
如果为选项2,则将这样的内容放入/etc/bash.bashrc
其他shell启动文件中。
confirm() {
echo -n "Do you want to run $*? [N/y] "
read -N 1 REPLY
echo
if test "$REPLY" = "y" -o "$REPLY" = "Y"; then
"$@"
else
echo "Cancelled by user"
fi
}
如果是选项3,则可以修改confirm
上面的脚本,或者某些命令可以在执行某些操作之前询问您的选项,例如rm -i
。你可以放进
alias rm='rm -i'
去/etc/bash.bashrc
。
我玩了bash有点,并想出了一个办法,可以做到这一点。
#!/bin/bash
debug_trap () {
echo "executing $BASH_COMMAND"
echo "Allow?"
select choice in yes no
do
if [ "$choice" = "yes" ]
then break
elif [ "$choice" = "no" ]
then return 1
fi
done
}
shopt -s extdebug
trap debug_trap DEBUG
您可以保存下,说这个剧本,confirm-any-command.sh
并source
在它bashrc
。它将要求您确认要尝试执行的每个命令。
请注意,这仅是概念验证黑客;我怀疑这种形式真的有用吗?如果您必须确认输入的每个命令,您很快就会养成习惯,在每个命令后自动打“ yes”。您的“命令结束”的精神映射将只是改变Enter到Enter,yes,Enter-你会打字它作为一个整体,甚至不试图花一些时间核实你真的想要这个命令来执行。这适得其反,不会对您有帮助。
Allow? 1) yes 2) no #?
既不停止yes
也不停止no
导致无限循环(Debian 8)
help select
:您应该输入1
or 2
而不是yes
or no
。对无效输入的自动重试是预期的行为(这样脚本编写者就不必重新发明while
自己,保持简洁明了),并且EOF输入终止循环。知道了这一点,您可以检查自己上面的脚本是否有效。我不会修改它,因为无论如何它是概念的粗略证明。
y e s Enter
榜样让我感到困惑
cd
和ls
?