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

45 unix bash shell

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

例如:

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

"$cmd &";
"$othercmd &";
Run Code Online (Sandbox Code Playgroud)

这不起作用 - 我怎么能这样做?

ngo*_*eff 46

不要引号

$cmd &
$othercmd &
Run Code Online (Sandbox Code Playgroud)

例如:

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~
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.就我所知,有必要省去分号. (2认同)
  • `cmd ='some-command"带参数"'; $ cmd`根本不是****与带有参数"`的`some-command"相同.如果你在参数列表中引用它,它就会失败; 如果你需要控制球体是否被扩展,那么它就会失败; 如果在执行时运行依赖于大括号扩展或参数扩展的代码,它将失败.请参阅[BashFAQ#50](http://mywiki.wooledge.org/BashFAQ/050):*我正在尝试将命令放在变量中,但复杂的情况总是失败!*. (2认同)

Gre*_*n23 30

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

cmd="google-chrome";
"${cmd}" &>/dev/null & disown;
Run Code Online (Sandbox Code Playgroud)

&>/dev/null(第一个)从中分离命令stdout.从和
stderr分离shell会话.从shell的作业列表中删除该命令./dev/null&
disown

你也可以&!代替& disown; 他们都是同一个命令.

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

cmd="google-chrome";
eval "${cmd}" &>/dev/null & disown;
Run Code Online (Sandbox Code Playgroud)

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

这是一个功能:

#!/bin/bash

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

cmd="google-chrome";
_evalBg "${cmd}";
Run Code Online (Sandbox Code Playgroud)

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