首页 > 解决方案 > 如何使shell脚本中的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) &

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

标签: bashshellforkexec

解决方案


您可以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因为我看不出将execand&一起使用有什么意义。)


推荐阅读