如何在不同进程中的 shell 脚本 运行 中执行 exec 命令?

How to make exec command in shell script run in different process?

我正在使用这个 GUI 应用程序 GTKWave,它有一个启动脚本 gtkwave,我已将其添加到我的系统路径中。在所述脚本的最后,有这一行:

$EXEC "$bundle_contents/MacOS/$name-bin" $* $EXTRA_ARGS

其中 $EXEC=exec

我的问题是,考虑到 exec 的工作方式,我的终端是 "hijacked" GUI 进程,这意味着我无法 运行 更多命令,直到我关闭 window,这并不理想。

我目前通过将这个函数放在我的 .bash_profile:

中来解决这个问题
function run-gtkwave ( ) { nohup gtkwave  &>/dev/null & }

虽然这可行,但很难将参数传递给 gtkwave。理想情况下,我可以在该 exec 命令之前做一个表单,但我不确定在 bash 中如何做。我知道 & 字符应该这样做,但是

$EXEC "$bundle_contents/MacOS/$name-bin" $* $EXTRA_ARGS &

不剪,

也不剪
"$bundle_contents/MacOS/$name-bin" $* $EXTRA_ARGS &

("$bundle_contents/MacOS/$name-bin" $* $EXTRA_ARGS) &

如何将此行修改为 运行 应用程序在其自己的进程中?

您可以通过将定义更改为:

使您的 run-gtkwave 函数将参数传递给 gtkwave
function run-gtkwave { nohup gtkwave "$@" &>/dev/null & }

由于使用 nohup 和输出重定向停止终端为 "hijacked",您可以通过执行 nohup 重定向和在那里输出重定向。 (如果标准输入是终端,nohup 将它从 /dev/null 重定向。)一种可能性是:

"$bundle_contents/MacOS/$name-bin" $* $EXTRA_ARGS </dev/null &>/dev/null &

(我省略了 $EXEC,因为我看不出同时使用 exec& 有任何意义。)