我有一个 read_user_input.sh 脚本:
#!/bin/bash
# set -e
prompt="bla? [Y/n] "
while true; do
read -p "$prompt" -n 1 -s -t 3 reply
case $reply in
""|Y|y) echo "bla!!!"; break;;
N|n) echo "no bla :( you suck"; break;;
*) ;;
esac
done
按我的预期工作 - 即
- 用户输入“Y”-> bla
- 用户输入“y”-> bla
- 用户按 Enter -> bla
- 超时-> bla
但是,添加时set -e
- 读取以错误 > 128 结束。
来自read --help
:
Exit Status:
返回码为零,除非遇到文件结尾、读取超时(在这种情况下大于 128)、发生变量分配错误或将无效文件描述符作为参数提供给 -u。
克服这个问题的最佳方法是什么?
- 添加
|| true
似乎不对,因为它会隐藏任何真正的错误。 - 我也不想删除
set -e
. - 我想到的另一件事是处理它,
trap
但这似乎有点矫枉过正
如果有超时,而不是添加
|| true
,设置为$reply
:y
这是一个使用命令替换的hack,它在
-e
未启用的地方分叉了一个子shell。使用@choroba 回答,我将开关盒更改为: