我通常使用以下命令运行多个命令:
sleep 2 && sleep 3
要么
sleep 2 ; sleep 3
但是,如果我想从一个命令行命令在后台同时运行它们呢?
sleep 2 & && sleep 3 &
不起作用。而且也没有更换&&
用;
有办法吗?
我通常使用以下命令运行多个命令:
sleep 2 && sleep 3
要么
sleep 2 ; sleep 3
但是,如果我想从一个命令行命令在后台同时运行它们呢?
sleep 2 & && sleep 3 &
不起作用。而且也没有更换&&
用;
有办法吗?
Answers:
您究竟希望它们如何运行?如果希望它们在后台启动并按顺序运行,则可以执行以下操作:
(sleep 2; sleep 3) &
另一方面,如果您希望它们在后台并行运行,则可以执行以下操作:
sleep 2 & sleep 3 &
并且可以将两种技术结合起来,例如:
(sleep 2; echo first finished) & (sleep 3; echo second finished) &
重击是重击,通常有多种不同的技术可以完成相同的任务,尽管有时它们之间存在细微的差异。
sleep 2 && sleep 3 &
?我用bash尝试过,它似乎以相同的方式工作(尝试使用echo)。
sleep 2 && echo "foo" && sleep 3 & echo "bar""
吗?该&&
运营商告诉shell之前要执行的命令,并且仅当没有任何错误命令执行shell执行后续命令。这与本质上是不同的;
,因为;
除非上一条命令是致命错误,否则无论上一条命令的退出状态如何,都可以使其执行下一条命令。该&
告诉shell执行所有的“连接”命令的它前面,在背景中。这里的“已连接”表示命令是管道(|
)或逻辑运算符的一部分。
Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence.
在bash手册中。
您需要在上一个版本中添加一些括号-
(sleep 2 &) && (sleep 3 &)
或者这也可以-
(sleep 2 &) ; (sleep 3 &)
&
,其退出状态始终为零。因此,以上两种情况都做相同的事情(shell依次异步地执行双方)。
上面的答案使用括号。Bash也可以将括号用于类似目的:
{ sleep 2 && sleep 3; } &
请注意,花括号对语法更挑剔-后面{
的空格,前面的空格}
和最后一个分号是必需的。在某些情况下,括号更有效,因为它们不会分叉新的子外壳。在这种情况下,我不知道它是否有所作为。
{ sleep 2; sleep 3; } &
呢
您可以使用bash命令替换,$(command)
如下所示:
$(command1 ; command2) &
请注意,stdin和stdout仍链接到父进程,并且至少重定向stdout可能很棘手。因此,您也可以将命令链接在一行中,然后将字符串传递给bash
命令以产生一个新进程来处理执行。
bash -c "command1 ; command2" &
当您需要在后台运行多个命令时,这在bash脚本中特别有用。
这两个语句应该等效。在这两种情况下都会生成一个bash进程来处理命令(命令链),&
最后会分离执行。
这次,您可以在命令末尾的&>/dev/null
之前添加,&
以至少重定向stdout,并避免在父进程的stdout上输出。就像是:
bash -c "command1 ; command2" &>/dev/null &
如果要顺序运行多个命令,则有一个非常简单的方法可在所有地方使用:创建文件!这种方法的好处是它干净简洁。
首先,使用名称创建文件,例如commands.sh
。然后,将命令放在此处。这是一个示例:
commands.sh:
#!/system/bin/sh
sleep 3;
sleep 2;
好的,现在我们进入了最后一步。要在后台(顺序)运行命令,只需运行:
$ sh commands.sh &
()
包围命令。