我怎样才能中断 bash 脚本,直到 n 秒过去或者按下任何键?
到目前为止我一直在尝试的是组合一个循环
while [ $n -gt 0 ] ; do
n=$(($n-1))
sleep 1
printf '%3s' " $n"
done
解决方案如下:按下某个键时退出循环
但我的循环并没有
while true; do
# I placed my loop here
read -n 1 -t 10 && break
done; read -t 0.1 -n 1000000
工作;
也没起作用
while [ $n -gt 0 ] ; do
n=$(($n-1))
sleep 1
printf '%3s' " $n"
read -n 1 -t 10 && n=0
done; read -t 0.1 -n 1000000
您的最后一段代码非常接近可行的解决方案。您错过的内容已
-t 10
传递给read
命令。这会在循环的每次迭代中引入 10 秒的额外延迟。您链接到的答案使用 ,read -t 10
因为它解决了使用 的问题sleep 10
。直到有按键,read -t 10
才完成 的工作sleep 10
。您想使用
sleep 1
,因此-t 1
在read
命令中改用:笔记:
printf
之后sleep 1
,因此我们这里就有之后read -t 1
。printf
引入了一个小问题:如果我们让&& n=0
您习惯,那么您会0
在击键后看到打印内容。break
而不是n=0
解决这个问题。echo
所做的。以上是一个空闲循环。它可以按原样工作,也可以使用您想要在每次迭代中运行的即时命令(如
df -h
您链接到的答案中所示),但是如果您想在“已经过去 n 秒或按下任何键”时中断任意命令或脚本(例如,可能启动长时间运行的命令,可能是异步的),那么事情就不会那么简单了。这可能是您的起点:您可以运行您想要的而不是
xeyes
,但请注意kill
trap 中的命令仅针对此单个进程。如果进程忽略信号、创建子进程或将自身作为守护进程,那么这种简单方法kill
可能还不够。还有其他一些策略,其中一些取决于程序/脚本的功能。我不会详细说明。如果您(或任何人)需要帮助,那么可以提出一个新问题(在进行研究之后;可能已经有足够的资源)。在新问题中,给出您想要以这种方式运行的程序/脚本的示例(请参阅mcve)。