我编写了一个 bash 函数,它接受命令作为参数,在后台运行它,并允许用户通过按任意键来终止命令。这部分工作正常。
但是,当我将它通过管道传输到whiptail
对话框仪表时,whiptail 按预期运行,但在它返回后,终端将不再显示按键。我仍然可以运行命令,只是看不到我正在输入的内容打印到屏幕上。输出的格式也很奇怪,stdout 出现在$
.
我很确定该read
命令是造成这种行为的原因,但我不明白为什么。任何人都可以提供任何见解吗?
#!/bin/bash
function killOnKeypress() {
local runcommand="${1}"
local args=(${@:2})
# Run the command in the background
"${runcommand}" ${args[@]} &
# Get the process id of $runcommand
local pid=$!
# Monitor $runcommand and listen for keypress in foreground
while kill -0 "${pid}" >/dev/null 2>&1; do
# If key pressed, kill $runcommand and return with code 1
read -sr -n 1 -t 1 && kill "${pid}" && return 1
done
# Set $? to return code of $runcommand
wait $pid
# Return $runcommand's exit code
return $?
}
function count100() {
for ((i = 0; i < 100; i++)); do
echo $i
sleep .02
done
}
killOnKeypress "count100" | whiptail \
--gauge "Counting to 100" \
16 56 \
0
虽然这不能回答 OP 问题,但它对于登陆这里的其他人可能很有用,寻找修复/解决方法。
正如 NickD 在他的评论中指出的那样,whiptail 设置 -echo (在我的环境中不仅仅是回声)。
要修复你的脚本,你可以把
最后。
您可以在脚本运行前后使用“stty -a”看到您的脚本(whiptail)发生了什么变化。
当然,您可以将输出保存到文件中,以便更容易发现差异:
运行你的脚本 - 你的终端被弄乱了,用“reset”或“tset”或“stty sane”重置它,然后再次运行“stty”命令,然后在它之后进行比较:
这可能
whiptail
会使终端处于奇怪的状态。尝试stty sane
作为命令(你必须盲打,所以要小心)。如果这样可以修复终端,那么这可能就是问题所在。