如何在bash脚本中执行脚本,而不是等待它完成?

时间:2013-11-26 18:49:46

标签: bash

我正在编写一个偶尔运行的脚本,并从mysql db中取出作业。当我这样做时,我会运行以下内容:

job="/tmp/blah.sh arg1 arg2 arg3"
eval $job

我需要它在运行eval后立即继续运行,而不是等待其他脚本完成。有什么简单的方法可以做到这一点?我试过了

exec $job & 

基于我在这里找到的一个帖子,但是反过来说,它运行了脚本,然后在“作业”完成后停止了,并停止了我的整个脚本。

编辑:

我正在运行的分离我的args和脚本的问题是作业有多行,看起来像:

/tmp/blah1.sh arg1 arg2 arg3 arg4
/tmp/blah2.sh null null null arg4
/tmp/blah3.sh arg1 null arg3 arg4

所以目前我只运行它:eval $ jobs:如果只有一行,如果有多个,我做一个for循环并运行每一行。在for循环中运行它以获取和分离args和脚本的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

我不会使用eval;相反,将命令名与参数分开,然后以正常方式调用命令。

jobCmd="/tmp/blah.sh"
jobArguments=( "arg1" "arg2" "arg3" )

$jobCmd "${jobArguments[@]}" &

答案 1 :(得分:1)

不要使用exec - 它会将您正在运行的脚本替换为您正在调用的内容。

eval "$job" &

应该这样做。

更新:

  • 如果必须通过存储在变量中的字符串执行命令,@ chepner的方法优于eval
  • 但一般来说,任何命令都可以按原样发送到后台,只需附加&
  • 在后台运行的作业的输出可能会使bash提示看起来消失,可能会错误地显示某些内容仍在执行。换句话说:调用后台任务的脚本可能已经结束,但是否则可能出现。只需按Enter即可查看bash提示是否重新出现。