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

时间:2018-08-22 17:04:40

标签: bash shell fork exec

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

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

其中$EXEC=exec

我的问题是,考虑到exec的工作方式,我的终端被GUI进程“劫持”,这意味着在关闭窗口之前,我无法再运行任何命令,这是不理想的。

我目前通过将此函数放在.bash_profile中来解决此问题:

function run-gtkwave ( ) { nohup gtkwave $1 &>/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) &

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

1 个答案:

答案 0 :(得分:1)

您可以通过将定义更改为以下内容,使run-gtkwave函数将参数传递给gtkwave

function run-gtkwave { nohup gtkwave "$@" &>/dev/null & }

由于使用nohup并进行了输出重定向,可以防止终端被“劫持”,因此您可以通过进行gtkwave重定向和在那里的输出重定向来解决nohup中的问题。 (如果标准输入是终端,则nohup将其从/dev/null重定向。)一种可能性是:

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

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