我想要运行4个命令:
sudo mkdir -p /data/db && \
sudo chmod 755 /data/db && \
sudo chown -R addison.pan: /data && \
mongod &
如果上面的其他3个成功,我只想在后台运行mongod。但是当我将其键入bash时,它将整个事务作为一个后台任务运行。我如何仅在后台运行mongod
,并且仅在它到达时才运行?
答案 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