特别是,我创建了一个脚本来启动 Firefox,双击该脚本并选择“在终端中运行”,但是当 shell 退出时,Firefox 会立即被终止。
我该如何防止这种情况发生?
答案1
您需要将其放在nohup
launch 命令之前 firefox
,因此它需要如下所示:
>$ nohup firefox
答案2
另外,请确保将 Firefox 作为后台作业执行,而不是作为前台运行,因为 shell 是父级,并且在返回提示之前等待 Firefox 运行并退出。
答案3
您在网上找到的大多数解决方案都会在子 shell 中运行 Firefox 的脚本。该子 shell 退出后,您将重新获得控制权。如果 Firefox 脚本在后台运行,您将看不到它的更改和变量设置,并且如果其父 shell(您的真实 shell)退出,它可能仍会在后台继续运行。
其背后的主要原因是 shell,包括 bash,它们之间有非常明显的区别
- 交互模式:它们显示提示,读取用户的命令,并循环执行它们。
- 和非交互模式:在这种情况下,它们本质上是作为解释器语言执行的,解释 shell 脚本。
在脚本执行后(这次是 firefox 启动器/包装器脚本),没有简单的方法可以将 bash 从非交互式脚本模式更改为交互式脚本模式。
这是可能的,但据我所知,没有 shell 对此支持。
幸运的是,有许多棘手的方法可以实现您的目标:
- 您可以运行非交互式脚本作为 bash 的初始化文件。所以:
bash --bashrc /here/is/what/i/want.sh
。 - 你可以修改
/here/is/what/i/want.sh
重新执行它自己的解释器,但此时已经处于交互模式。这可以通过命令来完成exec /bin/bash -i
。只需将其放在脚本的末尾即可。