我很想知道'&'是否有所作为当进程具有输入/输出重定向以在后台运行进程时,代码中使用运算符
在后台运行流程方面,这些代码行之间有什么区别?如果有,我怎样才能确定差异是什么?
setsid python script.py < /dev/zero &> log.txt &
setsid python script.py < /dev/zero & > log.txt &
setsid python script.py < /dev/zero > log.txt &
setsid python script.py & < /dev/zero > log.txt
答案 0 :(得分:5)
此处&
有两种用途。一个是所谓的控制运营商。每个命令都由&
,;
或<newline>
等控制运算符终止。它们之间的区别在于;
和<newline>
在前台运行命令,&
在后台运行。
setsid python script.py < /dev/zero & > log.txt &
setsid python script.py & < /dev/zero > log.txt
因此,这两行实际上分别执行两个命令。第一个相当于两个命令:
setsid python script.py < /dev/zero &
> log.txt &
第二个相当于:
setsid python script.py &
< /dev/zero > log.txt
如果您想知道,是的,> log.txt
和< /dev/zero > log.txt
都是合法的命令。缺少命令名称,他们只是处理重定向:每个都创建一个名为log.txt
的空文件。
setsid python script.py < /dev/zero &> log.txt &
此&>
版本与& >
版本不同。没有空格的&>
是bash中的特殊重定向运算符,它重定向stdout和stderr。
setsid python script.py < /dev/zero > log.txt &
此最终版本与前一版本类似,只是它只将stdout重定向到log.txt
。 stderr继续前往终点站。
答案 1 :(得分:2)
所以&
意味着不同的东西,具体取决于上下文。
在第一种情况下:
setsid python script.py < /dev/zero &> log.txt &
第一个&
与>
一起用作&>
,这意味着重定向stderr和stdout。最后一个&
表示在后台运行
在第二种情况下:
setsid python script.py < /dev/zero & > log.txt &
你单独拥有第一个&
,如上所述,这意味着背景中的过程,在这种情况下是setsid python script.py < /dev/zero
,它将被放入后台。然后该行的其余部分说,没有进程重定向到log.txt和背景它,真的有点废话。
在第三种情况下:
setsid python script.py < /dev/zero > log.txt &
你最后有&
,所以整个事情都放在后台,但你的重定向只将stdout重定向到log.txt,而不是像第一种情况那样将stderr重定向。
在最后的案例中:
setsid python script.py & < /dev/zero > log.txt
您将setsid python script.py
放在后台,并将stdout中的任何内容重定向到log.txt中,并将/dev/zero
放入stdin中。
答案 2 :(得分:0)
它有所不同。 &
兼作命令分隔符(就像;
是命令分隔符一样)。你在
setsid python script.py & < /dev/zero > log.txt
在后台运行setsid python script.py
并运行&#34; null&#34;前台中的命令(位于&
之后)(最后一个额外的&
将在后台运行它)。那&#34; null&#34;命令将其stdin重定向到 / dev / zero ,并将其stdout重定向到 log.txt 。
此外,&>
是Bash中的特殊运算符。 foo &>out
在运行foo
时将stdout和stderr重定向到 out 。它与foo & >out
不同,后台运行foo
也会将null命令的输出重定向到 out 。
(对&#34; null&#34;命令的这种支持就是为什么像>foo
这样的惯用语在单独的一行上,你有时会在shell脚本中看到它,用于截断文件。)