使用输入/输出重定向在后台运行进程

时间:2015-04-15 18:45:45

标签: linux bash shell background-process

我很想知道'&'是否有所作为当进程具有输入/输出重定向以在后台运行进程时,代码中使用运算符

在后台运行流程方面,这些代码行之间有什么区别?如果有,我怎样才能确定差异是什么?

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

3 个答案:

答案 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脚本中看到它,用于截断文件。)