运行 具有 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里。
我很想知道当进程 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里。