我正在尝试实现一个等待时间,用户可以按任意键选择跳过该等待时间。此外,它不能在终端上打印任何内容,因为我正在使用它来显示进度条。我很难捕捉和测试用户输入,更困难的是它不能导致总等待时间进一步延迟。
以下是我目前所拥有的:
read -t 0 input </dev/tty1
if [[ $input -ne "" ]]; then
exit 0
fi
这是在更新进度条的循环内。它成功地避免了增加更多延迟或打印不需要的行,但它没有实现其功能。
-t 0 不添加进一步延迟
从“/dev/tty1”读取不会添加不需要的行
我怎样才能实现这个目标?
答案1
信不信由你,正是零让你陷入了困境。如果你把它改成一个非常小的数字,比如 .01,它就会起作用。你可以像这样进一步简化它:
if $(read -t.01 -sn1); then exit 0; fi
答案2
你想运行两件事平行线。
- 读取输入等待 5 秒(例如)
- 更新进度条(显示5秒已完成)
为实现这一点,请不要将read
命令放在循环内。
相反,做这样的事情:
for i in {1..10}; do sleep 0.5s; echo ${i}0; done | zenity --progress --auto-close --text="waiting for input...5sec" 2>/dev/null &
read -t 5 asd && kill $!
(将以上两行放入一个文件(例如 abc.sh)并运行它bash abc.sh
)
解释 :
第一个命令(更新进度条)被发送到后台&. 如果读取命令先完成,kill $!
则会关闭进度条。
备注:结账 GNU 并行.这将帮助你同时做更多的事情。