考虑这个脚本:
#!/bin/bash
echo "hi there $(whoami)"
[ "`whoami`" = "root" ] || {
exec sudo -u root "$0" "$@"
echo "this is never called"
}
read -s -p "enter stuff: " stuff
echo "answer: $stuff"
如果我以用户身份运行它lars
并输入woohoo
,那么我会得到以下输出:
hi there lars
hi there root
enter stuff:
answer: woohoo
但是,如果我ctrl-c
在脚本等待我的read
输入时,我就会进入一种奇怪的状态。控制台似乎陷入静音模式。如果我省略-s
(=静默模式)选项,则不会出现该问题。
您知道这里的确切问题是什么吗?如果有人ctrl-c
在输入过程中按下,我怎样才能使脚本正常运行。
我正在运行 bash 4.3.30。
答案1
显然这是一个Bash 4.3 中的错误已在 Bash 4.4 中修复:
哦。修复了一个错误,如果在 readline() 调用(包括“read -e”和“read -s”)中收到致命信号,则导致 bash 无法清理 readline 的状态(包括终端设置)。
我使用恢复终端设置的陷阱解决了这个问题:
[ "`whoami`" = "root" ] || {
exec sudo -u root "$0" "$@"
}
function finish {
stty echo echok
}
trap finish EXIT
read -s -p "enter stuff: " stuff
echo "answer: $stuff"