myf-6ren">
gpt4 book ai didi

庆典外壳 : Can a control-c cause shell to write an empty file?

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

我有一个 bash shell 脚本。它写出到一个文本文件。如果我在命令级别使用 control-c 停止脚本,它的大部分工作都会发现。有时写入的文件如

echo "hello world" >myfile.txt

最终会是空的。因此,当我点击 control-c 停止运行 shell 脚本时,它可能会在打开文件写入的实例中被捕获,并且在将任何内容放入其中之前,它没有机会并离开它空?

如果是这样的话。我可以在 bash shell 脚本中做什么,以便它在写入文件后并在有机会再次写入文件之前优雅地退出,因为它是在 while 循环中执行此操作的。谢谢!

最佳答案

是的,您最终可能会得到一个空文件。

一个解决方案是捕获由 ^C (SIGINT) 引起的信号,并设置一个可以在循环中检查的标志:

triggered=0

trap "triggered=1" SIGINT

while true
do
if [ $triggered = 1 ]
then
echo "quitting"
exit
fi
...do stuff...
done

编辑: 没有意识到即使 shell 自己的 SIGINT 处理会被困住,它仍然会将 SIGINT 传递给它的子进程,如果不处理它们就会被杀死SIGINT 本身。

因为 echo 是一个内置的 shell,它可能会在杀戮中幸存下来,但我不完全确定。快速测试似乎工作正常(文件总是被写入,而在没有捕获 SIGINT 的情况下,我偶尔也会得到一个空文件)。

正如@spbnick 在评论中建议的那样,在 Linux 上您可以使用 setsid命令为您启动的任何子进程创建一个新的进程组,这将防止它们被发送到 shell 的 SIGINT 杀死。

关于庆典外壳 : Can a control-c cause shell to write an empty file?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16515081/

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