如果命令在字符串中,如何在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)
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/