我试图编写一个 bash
脚本,使用 gnome-open
命令打开某些文件(主要是 pdf 文件)。我还想让终端在打开 pdf 文件后退出。
我试过在脚本末尾添加 exit
,但这并不能关闭终端。我试着在网上搜索问题的答案,但没有找到合适的答案,如果你们能帮上忙,我会非常感激。
我需要的答案只能杀死我运行命令的终端,而不是所有终端,这可能吗?我接受的上一个答案会杀死所有打开的终端窗口。直到今天我才意识到是这种情况。
如果只打开一个文件,就不**需要使用脚本,因为脚本的目的是方便地连续运行多个命令,而这里只需要运行两个命令(包括 exit
)。
如果你想在一条命令或一连串命令之后运行 exit
,你可以使用 &&
操作符(在上一条命令或一连串命令成功时执行下一条命令)或 ;
操作符(在上一条命令或一连串命令成功或失败时执行下一条命令)将它与你已经执行的命令链起来。
在这种情况下,可以这样做
gnome-open <path_to_pdf_file> && exit
*<path_to_pfd_file> = pdf 文件的路径</sub>;
将 exit
放在脚本末尾不起作用,因为它只是退出运行脚本的 bash
实例,而该实例是另一个 bash
实例,而不是终端内部的 bash
实例。
如果你想使用脚本,最直接的方法就是像这样调用脚本:
<path_to_script> && exit
或者,如果脚本在终端的当前工作目录中,也可以这样调用:
./<script> && exit
如果你真的*不想/不能这样做,第二个最直接的方法就是在脚本末尾添加这一行:
kill -9 $PPID
这将向脚本的父进程(链接到终端的 bash
实例)发送一个 SIGKILL
信号。如果只有一个 bash
实例链接到终端,则该实例被杀死后会导致终端自行关闭。如果有多个 bash
实例链接到终端,则该实例被杀死不会导致终端自行关闭。
该脚本会终止终端,从而终止 shell 和他自己。
*它会无情地杀死所有进程。如果你在终端中打开了多个标签页,那么这些标签页也会被关闭。
*问题是,如果打开了多个终端,而且这些终端都是 gnome-terminal-server
的子进程,那么所有终端都会被杀死。
在这种情况下,应该在一个独立的终端中启动脚本,例如 xterm
。
<your_command> & disown
PPPID=$(awk '{print $4}' "/proc/$PPID/stat")
kill $PPPID
PPID 是父进程 ID,在本例中为 shell(例如 /bin/bash`)的 ID
PPPID 是 PPID 的父进程 ID,这里指终端窗口
<your_command> & disown
.在 bash shell 中,disown 内置命令用于从作业表中删除作业,或标记作业,以便在父 shell 接收到 SIGHUP 信号时(例如用户注销时)不向其发送该信号。
获取文件 /proc/$PPID/stat
第四列的值(例如,对于 /proc/1/stat
,返回 0)