'nohup 2>&1 >out' 对比 'nohup >out 2>&1'

'nohup 2>&1 >out' vs 'nohup >out 2>&1'

对我来说,以下两个 bash 命令会产生不同的结果:

# returns instantly
ssh localhost 'nohup sleep 5 >out 2>&1 &'
# returns after 5 seconds
ssh localhost 'nohup sleep 5 2>&1 >out &'

令人惊讶,因为以下两个 bash 命令产生相同的结果:

# both return instantly
nohup sleep 5 >out 2>&1 &
nohup sleep 5 2>&1 >out &

为什么?

这个表格:

command >out 2>&1

... 取出标准并将其放入文件。然后它获取标准错误并将其放在与标准输出相同的位置。 两个流 都发送到一个文件。

这个表格:

command 2>&1 >out

... 获取标准错误并将其放在标准输出中。然后它将发送到标准输出的内容发送到文件。它不会向文件发送标准错误。

因此,在您的终端上,您正在后台执行任务并立即提示 return。当使用 ssh 时,在第一种情况下,没有输出显示,因为所有内容都已发送到文件中。在另一种情况下,标准输出仍然可以显示应用程序尝试发送到标准错误的信息。

我的期望是 ssh returns 在第一种情况下立即执行,因为永远不会有任何输出。在第二种情况下,有一个打开的流可能 return 数据供您查看。