我编写了一个 bash 函数,它接受命令作为参数,在后台运行它,并允许用户通过按任意键终止该命令。这部分工作正常。
但是,当我通过管道将其传输到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
答案1
虽然这不能回答OP问题,但对于其他来到这里寻找修复/解决方法的人来说可能很有用。
正如 NickD 在评论中指出的那样,鞭尾设置了 -echo(在我的环境中不仅仅是 echo)。
要修复您的脚本,您可以放置
stty echo
在它的最后。
您可以在脚本运行之前和之后使用“stty -a”查看脚本(whiptail)的更改。
当然,您可以将输出保存到文件中,以便更轻松地发现差异:
stty -a > good_terminal
运行你的脚本 - 你的终端被搞乱了,用“reset”或“tset”或“stty sane”重置它,然后再次运行“stty”命令,然后比较它:
stty -a > bad_terminal
diff good_terminal bad_terminal
答案2
这可能会使whiptail
终端处于奇怪的状态。尝试stty sane
作为命令(您必须盲输入它,所以要小心)。如果这修复了终端,那么这可能就是问题所在。