gpt4 book ai didi

bash - 在静默模式下读取后在 bash 脚本中捕获 ctrl+c

转载 作者:行者123 更新时间:2023-11-29 09:01:01 25 4
gpt4 key购买 nike

我正在处理的脚本以静默模式读取单个字符并将其存储到 $c

这是一个测试脚本,它做的事情与示例相同:

    #!/bin/bash

gracefulExit() {
echo "exiting..."
#other stuff would go here
exit 1
}

trap gracefulExit INT

while [ 1 = 1 ]
do
read -s -r -n1 c
echo "character read"
done

我遇到的问题是,如果您使用 ctrl+c 来中断脚本,shell 将保持静默模式(我看不到我键入的任何内容)并且它不会恢复正常,直到我导出。我注意到这只发生在我捕获 ctrl+c 之后(没有陷阱,它从静音模式中踢出)。我的脚本要求我设置陷阱以便进行清理。

这是在 4.2.10 上

有什么想法吗?

非常感谢您的帮助!

最佳答案

尝试在退出函数中重新启用 tty echo:

#!/bin/bash

gracefulExit() {
echo "exiting..."
# reenable tty echo
stty icanon echo echok
exit 1
}

trap gracefulExit INT

while [ 1 = 1 ]
do
read -s -r -n1 c
echo "character read"
done

在我对 OS X 的测试中,read 禁用了这些设置:icanon echo echok。您可以使用 stty -a

检查您的系统

在调用脚本之前运行它,然后在脚本完成后再次运行它,并检查输出中的差异以确定程序更改的内容。然后将更改的标志设置回去。

$ diff before.out after.out
2,3c2,3
< lflags: icanon isig iexten echo echoe echok echoke -echonl echoctl
< -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
---
> lflags: -icanon isig iexten -echo echoe -echok echoke -echonl echoctl
> -echoprt -altwerase -noflsh -tostop -flusho -pendin -nokerninfo

在这里您可以看到已更改的标志:icanon、echo、echok 已禁用。您可以在开头用“-”来识别它。

最后这是您的脚本的另一个版本,它可以自动完成全部工作:

#!/bin/bash

# save the current tty flags
tty_flags=`stty -g`

gracefulExit() {
echo "exiting..."
# set the saved tty flags
stty $tty_flags
exit 1
}

trap gracefulExit INT

while [ 1 = 1 ]
do
read -s -r -n1 c
echo "character read"
done

关于bash - 在静默模式下读取后在 bash 脚本中捕获 ctrl+c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22679685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com