使用input/输出redirect在后台运行进程

我很想知道,当进程有input/输出redirect来在后台运行进程时,在代码中使用“&”运算符是否有所不同

在后台运行进程方面,这两行代码之间有什么区别? 如果有的话,我怎样才能确定分歧将是什么?

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 

Solutions Collecting From Web of "使用input/输出redirect在后台运行进程"

控制操作员

这里有两个用途。 一个是所谓的控制操作员 。 每个命令都由一个控制操作符(如& ;<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继续去终端。

所以&意味着不同的事情,取决于上下文。

在第一种情况下:

 setsid python script.py < /dev/zero &> log.txt & 

第一个&> as一起使用&>这意味着重定向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放在后台,把任何东西的标准输出重定向到log.txt,并把/dev/zero放到没有任何东西的标准输入中。

它有所作为。 &双打作为命令分隔符(就像;是命令分隔符)。 你真的在做些什么

 setsid python script.py & < /dev/zero > log.txt 

在后台运行setsid python script.py ,并在前台运行一个“null”命令(在&后面加一个& ,最后在后台运行)。 该“null”命令将其stdin重定向到/ dev / zero ,其stdout重定向到log.txt

另外, &>是Bash中的一个特殊操作符。 foo &>out在运行foo foo &>out将stdout和stderr重定向。 它与foo & >out不一样,在后台运行foo也会将null命令的输出重定向到out

(这种对“null”命令的支持就是为什么在单独的行中使用>foo这样的成语,有时在shell脚本中看到,它是用来截断文件的)。