从脚本执行后台执行shell命令

时间:2010-09-10 10:36:11

标签: bash unix shell

如果命令在字符串中,如何在bash脚本中在后台执行shell命令?

例如:

#!/bin/bash
cmd="nohup mycommand";
other_cmd="nohup othercommand";

"$cmd &";
"$othercmd &";

这不起作用 - 我该怎么做?

4 个答案:

答案 0 :(得分:44)

不要引用

$cmd &
$othercmd &

例如:

nicholas@nick-win7 /tmp
$ cat test
#!/bin/bash

cmd="ls -la"

$cmd &


nicholas@nick-win7 /tmp
$ ./test

nicholas@nick-win7 /tmp
$ total 6
drwxrwxrwt+ 1 nicholas root    0 2010-09-10 20:44 .
drwxr-xr-x+ 1 nicholas root 4096 2010-09-10 14:40 ..
-rwxrwxrwx  1 nicholas None   35 2010-09-10 20:44 test
-rwxr-xr-x  1 nicholas None   41 2010-09-10 20:43 test~

答案 1 :(得分:26)

建立ngoozeff的答案,如果你想让命令在后台运行完全(即,如果你想隐藏其输出阻止它被关闭当你关闭它的终端窗口时),你可以这样做:

cmd="google-chrome";
"${cmd}" &>/dev/null &disown;

&(第一个)从stdin分离命令
>/dev/nullstdoutstderr分离 shell会话
&disown shell的作业列表中删除命令

您也可以使用&!代替&disown;他们都是同一个命令。

此外,将命令放在变量中时,使用eval "${cmd}"而不是"${cmd}"更合适:

cmd="google-chrome";
eval "${cmd}" &>/dev/null &disown;

如果直接在终端中运行此命令,它将显示命令启动的进程的PID。但是,在shell脚本中,将显示无输出

这是一个功能:

#!/bin/bash

# Run a command in the background.
_evalBg() {
    eval "$@" &>/dev/null &disown;
}

cmd="google-chrome";
_evalBg "${cmd}";

http://felixmilea.com/2014/12/running-bash-commands-background-properly/

答案 2 :(得分:1)

这是有效的,因为它是一个静态变量。 你可以做更酷的事情:

filename="filename"
extension="txt"
for i in {1..20}; do
    eval "filename${i}=${filename}${i}.${extension}"
    touch filename${i}
    echo "this rox" > filename${i}
done

此代码将创建20个文件,动态设置20个变量。当然你可以使用数组,但我只是向你展示这个功能:)。请注意,您可以使用变量$ filename1,$ filename2,$ filename3 ...因为它们是使用evaluate命令创建的。在这种情况下,我只是创建文件,但您可以使用创建命令的动态参数,然后在后台执行。

答案 3 :(得分:1)

例如,您有一个名为run.sh的启动程序,以启动它在后台运行,执行以下命令行。 ./run.sh& amp;> / dev / null&