我正在尝试编写一个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 command
exec ./your-script
exec
: 一个例子
例如,假设我有一个名为的 shell 脚本count
,标记为可执行,位于当前目录中。它包含:
#!/usr/bin/env bash
for i in {5..1}; do echo $i; sleep 1; done
然后,在终端中运行:
exec ./count
这将每秒打印一个数字5
、4
、3
、2
和,然后终端窗口关闭。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
我个人会在 subshell 中执行打开 pdf 或其他文件的命令,延迟打开文件,然后退出。基本上,以下是我测试过的内容(nohup gnome-open *.pdf &); sleep 2; exit
对此的变体是nohup gnome-open *.pdf && sleep 2 && exit