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

Running a process in the background with input/output redirection

我很想知道在\\'位置是否有所不同


控制操作员

这里&有两种用途。一种是作为所谓的控制操作员。每个命令都由诸如&;<newline>之类的控制运算符终止。它们之间的区别是;<newline>在前台运行命令,而&在后台运行命令。

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

因此,这两行实际上分别执行两个命令。第一个等效于两个命令:

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

第二个等效于:

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

如果您想知道,> log.txt< /dev/zero > log.txt都是合法命令。缺少命令名称,它们仅处理重定向:每个命令都会创建一个名为log.txt

的空文件。

重新导向

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

带有&>的版本与带有& >的版本不同。 &>没有空格是bash中的一种特殊的重定向运算符,它可以同时重定向stdout和stderr。

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

此最终版本与上一个相似,只是它仅将stdout重定向到log.txt。 stderr继续前往终端。


因此,&的含义取决于上下文。

在第一种情况下:

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

第一个&>一起用作&>,这意味着重定向stderr和stdout。最后一个&表示在后台运行

在第二种情况下:

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

您单独拥有第一个&,如上所述,但这意味着后台进程,在本例中为setsid python script.py < /dev/zero,该进程被置于后台。然后该行的其余部分说,不要将任何进程重定向到log.txt并对其进行后台处理,这确实有点废话。

在第三种情况下:

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

您在末尾有&,因此整个内容都放在了后台,但是您的重定向仅将stdout重定向到log.txt,而不是stderr,就像在第一种情况下一样。

在最终情况下:

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

您将setsid python script.py放在后台,然后将什么都没有的stdout重定向到log.txt,然后将/dev/zero没什么都带到stdin中。


这有所作为。 &兼用作命令分隔符(就像;是命令分隔符一样)。

之类的东西您实际上在做什么

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

在后台运行setsid python script.py,并且在前台运行"空"命令(在&之后)(末尾另外一个&将在后台运行它)。该"空"命令将其stdin重定向到/ dev / zero,并将其stdout重定向到log.txt。

此外,&>是Bash中的特殊运算符。 foo &>out在运行foo时将stdout和stderr都重定向到out。它与foo & >out不同,后者在后台运行foo也会将空命令的输出重定向到out。

(这种对" null"命令的支持就是为什么在单独的行上有时会出现类似>foo的习惯用法,有时您会在shell脚本中看到这种习惯用法用于截断文件的原因。)