在关闭终端后执行bash脚本是否可行?

3
我知道有一个名为.bash_profile的文件,当你打开终端时会执行其中的代码(bash脚本)。
还有另一个名为.bash_logout的文件,当你退出终端时会执行其中的代码。
我想在终端被关闭时执行某些脚本,应该怎么做?
.bash_logout并不能覆盖终端被关闭的情况。)

1
你可以检查一下trap命令。另外,我认为将这个问题发到https://serverfault.com/上寻找更好的答案会更好... - undefined
2
“终端被杀死”是什么意思?.bash_profile.bash_logout与终端无关:它们分别在登录 shell 启动和退出时执行。唯一涉及终端的方式是它启动和停止 shell。 - undefined
@chepner,例如,终端被VSCode杀死。 - user15991907
1个回答

7

当终端被关闭时,如何执行一些脚本?

我理解为“在终端窗口关闭时执行一个脚本”。要实现这个功能,请将以下代码添加到您的.bashrc.bash_profile文件中:

trap '[ -t 0 ] || command to execute' EXIT

当然,您可以将“要执行的命令”替换为“source ~/.bash_exit”,并将所有命令放在您的主目录中的文件“.bash_exit”中。特殊的EXIT陷阱在shell退出时执行(例如通过关闭终端,但也通过在提示符上按CtrlD,或执行“exit”等方式退出)。"[ -t 0 ]"检查stdin是否连接到终端。由于使用了“||”,只有在测试失败时才会执行下一个命令,而关闭终端时会失败,但其他常见的退出bash的方法(例如在提示符上按CtrlD或执行“exit”)则不会失败。

失败的尝试(仅在您尝试寻找替代方案时阅读)

在我所了解的终端中,当关闭窗口时,bash总是会收到SIGHUP信号。有时甚至会有两个SIGHUPs;一个来自终端,另一个来自关闭伪终端(pty)的内核。然而,在交互式会话中,有时候这两个SIGHUP都会丢失,因为bash的readline暂时使用自己的陷阱。奇怪的是,当存在EXIT陷阱时,SIGHUPs似乎总是被捕获到,即使该EXIT陷阱什么也不做。
然而,我强烈建议不要设置任何SIGHUP陷阱。Bash进程只有在当前命令完成后才会处理非EXIT陷阱。如果你运行sh -c 'while true; do true; done'并关闭终端,bash将会像你使用了disownnohup一样继续在后台运行。

这意味着当你杀死终端时,它会向其子进程发送一个HUP信号。我现在不方便进行实验,但这听起来像是可能取决于终端、桌面环境或窗口管理器的行为,因此提及您测试过的环境可能是有意义的。 - undefined
我完全同意你的观点。我从gnome-terminal收到了SIGHUP信号,并查看了一些其他问题/答案,其中相同的信号来自于lxterminal、xterm,甚至没有任何图形界面的tmux(参见这里这里)。我没有找到任何规定发送SIGHUP信号的标准,但由于Wikipedia将SIGHUP定义为“当进程的控制终端关闭时发送的信号。”,我只是假设这是事实上的标准。 - undefined
总之,我找到了一种不使用SIGHUP的方法,这种方法在其他方面也存在很多问题。 - undefined
@Socowi,vscode有一种方法可以关闭终端,不幸的是它不会触发你上面发布的命令。我不确定环境是否重要,我正在使用Windows和Git bash。 - user15991907
1
是的,终端可以产生影响,但最大的问题可能是Windows。信号、陷阱和TTY是Linux的特性。不确定在Windows上的git bash中有多少功能可用。首先,您可以尝试删除[ -t 0 ] ||这部分代码,看看是否有效。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接