如果命令在字符串中,如何在bash脚本中在后台执行shell命令?
例如:
#!/bin/bash
cmd="nohup mycommand";
other_cmd="nohup othercommand";
"$cmd &";
"$othercmd &";
这不起作用 - 我该怎么做?
答案 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/null
从stdout
和stderr
分离 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&