运行 具有 input/output 重定向的后台进程

Running a process in the background with input/output redirection

我很想知道当进程 input/output 重定向到 运行 后台进程时,在代码中使用“&”运算符是否会有所不同

differences/are这些代码行在 运行后台进程方面有什么区别。如果有,我如何确定差异是什么?

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

这很重要。 & 兼作命令分隔符(就像 ; 是命令分隔符一样)。你真正在做什么

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

是在后台运行宁setsid python script.py,也是在前台运行宁"null"命令(在&之后)(最后的附加 & 将 运行 它在后台)。该 "null" 命令将其标准输入重定向到 /dev/zero 并将其标准输出重定向到 log.txt.

另外,&>是Bash中的一个特殊运算符。 foo &>out 将 stdout 和 stderr 重定向到 out 而 运行ning foo。和foo & >out不一样的是,运行s foo在后台还会把一个null命令的输出重定向到out.

(这种对 "null" 命令的支持是为什么像 >foo 这样的习语在单独的一行中,有时在 shell 脚本中看到,适用于 t运行cating一个文件。)

控制运算符

这里&有两种用法。一种是所谓的控制运算符。每个命令都由控制运算符终止,例如 &;<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 &

&> 的版本与 & > 的版本不同。没有 space 的 &> 是 bash 中的一个特殊的 重定向运算符 ,它重定向 stdout 和 stderr。

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

这个最终版本与前一个版本类似,只是它只将标准输出重定向到 log.txt。 stderr 继续去终端。

因此 & 表示不同的意思,具体取决于上下文。

第一种情况:

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里。