运行 bash 脚本后退出终端

运行 bash 脚本后退出终端

我正在尝试编写一个bash脚本,使用该命令打开某些文件(主要是 pdf 文件)gnome-open。我还希望终端在打开 pdf 文件后退出。

我尝试exit在脚本末尾添加,但无法关闭终端。我尝试在线搜索问题的答案,但找不到合适的答案,如果你们能帮忙,我将不胜感激。

我需要一个答案,它只关闭我运行命令的终端,而不是所有终端,这可能吗?我接受的上一个答案会关闭所有打开的终端窗口。直到今天我才意识到这是事实。

答案1

如果你只打开一个文件,则不需要真的需要使用脚本,因为脚本的目的是为了简单地连续运行多个命令,而这里只需要运行两个命令(包括exit)。

如果您想exit在某个命令或一系列命令之后运行,则可以通过使用运算符&&(在前一个命令/命令链成功执行时将执行下一个命令)或使用运算符(在前一个命令/命令链成功;和失败时将执行下一个命令)将其链接到您已有的命令中。

在这种情况下,它将会是这样的:

gnome-open <path_to_pdf_file> && exit

*<path_to_pfd_file> = pdf 文件的路径

exit放在脚本末尾不起作用,因为它只是退出bash运行脚本的实例,该实例bash与终端的内部bash实例不同。

如果您无论如何都想使用脚本,最直接的方法就是像这样调用脚本:

<path_to_script> && exit

或者如果脚本位于终端的当前工作目录中,如下所示:

./<script> && exit

如果你真的不想/不能这样做,第二个最直接的方法是在脚本末尾添加此行:

kill -9 $PPID

这将向SIGKILL脚本的父进程(bash链接到终端的实例)发送信号。如果只有一个bash实例链接到终端,则终止该实例将导致终端自行关闭。如果多个实例链接bash到终端,则终止该实例不会导致终端自行关闭。

答案2

您可以使用。exec ./your-script

当 GNOME Terminal 等终端仿真器内部运行的初始进程(通常是 shell)退出时,它也会退出。

如果你已经在终端中,并且在退出该终端之前你唯一想做的事情就是运行一个特定的脚本(或程序),那么这意味着你不再需要在其中运行的 shell。因此,你可以使用 shell 的exec内置命令来制作 shell取代自身使用您的命令创建的进程。

  • 就你的脚本而言,这是另一个 shell 进程——就像第二当您运行不带 的脚本时,会创建 shell 进程exec

语法是,例如。exec commandexec ./your-script

exec: 一个例子

例如,假设我有一个名为的 shell 脚本count,标记为可执行,位于当前目录中。它包含:

#!/usr/bin/env bash
for i in {5..1}; do echo $i; sleep 1; done

然后,在终端中运行:

exec ./count

这将每秒打印一个数字5432和,然后终端窗口关闭。1

如果你从终端中运行的第一个进程以外的其他进程运行此命令(例如,如果你bash先运行以启动另一个 shell 实例),那么这将带你回到创建该命令的 shell进程,而不是退出终端。(此警告同样适用于exit基于的方法。)

您可以使用。./your-script; exit

如果你不想告诉你的 shell 用新进程替换它自己(通过exec),你可以告诉它继续运行但在新进程完成后立即退出。

为此,请运行您的命令和exit命令,并用 分隔,;以便它们可以在一行上给出。

语法是command; exit,例如。./your-script; exit

command; exit对阵command && exit

您可能会注意到这看起来类似于./your-script && exit科斯heemayl 的答案。区别在于:

  • &&仅当第一个命令时才运行第二个命令报告称其成功返回退出代码零。
  • ;无论第一个命令是否报告成功,都会运行第二个命令。

你想要哪一个取决于具体情况。如果命令失败,你是否希望调用 shell(和托管终端)保持运行?如果是,使用&&;如果不是,使用;

还有command || exit,仅当command已报告失败

答案3

此脚本将终止终端,从而终止 shell 和他自己。

它会毫不留情地终止所有进程。如果你在终端中打开了多个选项卡,那么这些选项卡也会被关闭。

问题是,如果打开了多个终端,并且这些是的子进程gnome-terminal-server,则所有终端都将被终止。

在这种情况下,脚本应该在独立的终端中启动,例如xterm

<your_command> & disown

PPPID=$(awk '{print $4}' "/proc/$PPID/stat")
kill $PPPID
  • 局部局部性病变

    PPID 是父进程 ID,在本例中是 shell ( e.g. /bin/bash)

  • 肺动脉高压

    PPPID 是 PPID 的父进程 ID,在本例中为终端窗口

  • <your_command> & disown

    在 bash shell 中,disown 内置命令用于从作业表中删除作业,或者标记作业,以便当父 shell 收到 SIGHUP 信号时(例如,如果用户注销),不会向它们发送 SIGHUP 信号。

  • awk '{print $4}' "/proc/$PPID/stat"

    获取文件第四列的值/proc/$PPID/stat(例如/proc/1/stat返回 0)

答案4

我个人会在 subshel​​l 中执行打开 pdf 或其他文件的命令,延迟打开文件,然后退出。基本上,以下是我测试过的内容(nohup gnome-open *.pdf &); sleep 2; exit

对此的变体是nohup gnome-open *.pdf && sleep 2 && exit

相关内容