在 Unix 中,常规命令的分隔方法是在命令末尾加上分号,如下所示:
cd /path/to/file;./someExecutable;
但它似乎不适用于这样的命令:
./myProgram1 > /dev/null &
./myProgram2 > /dev/null &
=>./myProgram1 > /dev/null &;./myProgram2 > /dev/null &;
有什么方法可以区分这些命令吗?
另外,如果我将以下 2 种情况复制粘贴到命令提示符中,它们是否等效?谢谢。
cd /path/to/file;./someExecutable;
cd /path/to/file;
./someExecutable;
答案1
那么“;”会让 shell 等待命令完成,然后继续执行下一个命令。
“&” 将把任何进程直接发送到后台并继续执行下一个命令 - 无论第一个命令是否完成或仍在运行。
因此“&;”不会像您预期的那样起作用。
但实际上我不确定您期望什么。
在你的 shell 中尝试一下:
sleep 2 && echo 1 & echo 2 & sleep 3 && echo 3
它将输出:2 1 3
现在将其与
sleep 2 ; echo 1 & echo 2 & sleep 3 ; echo 3
这将输出 1 2 3
问候。
答案2
command1 & command2
将执行command1
,将进程发送到后台,并立即开始执行command2
,即使command1
尚未完成。
command1 ; command2
一旦完成就会执行command1
然后执行,不管是否成功退出。command2
command1
command1
command1 && command2
只有在成功执行command2
后才会执行。如果失败,则不会执行。command1
command1
command2
(...此外,为了完整性...)
command1 || command2
command2
仅当失败时才会执行command1
(以非零退出代码退出)。