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

Run multiple commands, but run the last one in the background

我有 4 个命令要执行 运行:

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

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

使用父级:

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

要明确。无需尝试滥用语法来使用短路:

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

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

( compound-list )

Execute compound-list in a subshell environment […]

要将一个或多个命令分组到 相同 shell 过程中,请将那一系列命令括在花括号中:

{ compound-list ; }

Execute compound-list in the current process environment. […]

任何 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 & }

以上文档参考中均有描述。

您可以在 sudo 中 运行 多个命令,例如:

sudo sh -c 'mkdir -p /data/db && chmod 755 /data/db && chown -R <user>: /data' \
&& mongod &