kev's great solution 即使在 Bash 3.x 中也能正常工作。,但它会在每次循环迭代中引入 1 秒延迟 (-t 1) .
不幸的是,在 Bash 3.x 中,-t(超时)支持的最低值是1(秒)。
Bash 4.x 支持 0 和 fractional 值,但是:
支持任意键(例如q)的解决方案需要一个非零-t 值,但您可以指定一个非常接近@ 的值987654330@ 尽量减少延迟:
#!/bin/bash
# !! BASH 4.x+ ONLY
while :; do
# Loop command
date
# Check for 'q' keypress *waiting very briefly* and exit the loop, if found.
read -t 0.01 -r -s -N 1 && [[ $REPLY == 'q' ]] && break
done
# Post-loop command
date +%s
警告:以上使用0.01 作为几乎没有超时的值,但是,根据您的主机平台、终端程序和可能的 CPU 速度/配置,更大的值可能需要/可能支持较小的值。如果值太小,您会看到间歇性error setting terminal attributes: Interrupted system call 错误 - 如果有人知道原因,请告诉我们。
向jarno 致谢,感谢他在以下方面的帮助:
使用-t 0,根据help read(已添加重点)如下工作:
如果 TIMEOUT 为 0,则读取 返回
立即,不尝试读取任何数据,返回
只有在指定的输入可用时才能成功
文件描述符。
从 Bash v4.4.12 和 5.0.11 开始,不幸的是,-t 0 似乎忽略 -n / -N,所以只有ENTER 按键(或一系列按键以 ENTER 结束)导致read 指示数据可用。如果有人知道这是否是一个错误,或者这种行为是否有充分的理由,请告诉我们。
因此,只有使用 ENTER 作为退出键是目前可能的-t 0 解决方案:
#!/bin/bash
# !! BASH 4.x+ ONLY
while :; do
# Loop command
date
# Check for ENTER keypress and, after clearing the input buffer
# with a dummy `read`, exit the loop.
read -t 0 -r -N 1 && { read -r; break; }
done
# Post-loop command
date +%s