运行多个命令,但在后台运行最后一个命令

时间:2018-05-10 22:49:55

标签: bash shell posix

我想要运行4个命令:

sudo mkdir -p /data/db && \
sudo chmod 755 /data/db && \
sudo chown -R addison.pan: /data && \
mongod &

如果上面的其他3个成功,我只想在后台运行mongod。但是当我将其键入bash时,它将整个事务作为一个后台任务运行。我如何仅在后台运行mongod,并且仅在它到达时才运行?

2 个答案:

答案 0 :(得分:3)

要在单独的进程中运行一个或多个命令,请将该系列命令括在括号中。如单Unix规范中所述,§2.9.4 “Compound Commands”

  

( compound-list )

     

在子shell环境[...]

中执行 compound-list

要在相同的 shell进程中对一个或多个命令进行分组,请将这一系列命令括在花括号中:

  

{ compound-list ; }

     

在当前流程环境中执行 compound-list 。 [...]

任何POSIX shell都是如此(所以also works in Bash)。

所以你的例子可以改为:

sudo mkdir -p /data/db && \
sudo chmod 755 /data/db && \
sudo chown -R addison.pan: /data && \
( mongod & )

这可能很好,因为您希望将mongod进程分开。另一方面,更一般的答案是将命令列表分组在相同的shell进程中:

sudo mkdir -p /data/db && \
sudo chmod 755 /data/db && \
sudo chown -R addison.pan: /data && \
{ mongod & }

这些都在上面的文档参考中描述。

答案 1 :(得分:2)

明确。没有必要尝试滥用语法来使用短路:

if \
    sudo mkdir -p /data/db \
    && sudo chmod 755 /data/db \
    && sudo chown -R addison.pan: /data
then
    mongod & 
fi