stdin、stderr、重定向和日志

stdin、stderr、重定向和日志

这两条线有区别吗?

/home/user/script.sh >> /home/user/stdout_and_error.log  2>&1
/home/user/script.sh 2>&1 >> /home/user/stdout_and_error.log  

知道我想将脚本的标准输出和执行错误放入日志文件中。如果没有差异,如果我想记录日志记录本身怎么办?

答案1

是,有一点不同。

/home/user/script.sh >> /home/user/stdout_and_error.log  2>&1

这会将 STDOUT 和 STDERR 发送到/home/user/stdout_and_error.log.

/home/user/script.sh 2>&1 >> /home/user/stdout_and_error.log  

这会将 STDOUT 发送到/home/user/stdout_and_error.log,并将 STDERR 发送到之前的 STDOUT。

 

当您执行 shell 重定向时,重定向的左侧将转到重定向右侧当前所在的位置。意思是2>&1,它将 STDERR (2) 发送到 STDOUT (1) 当前所在的位置。
但是,如果您随后将 STDOUT 重定向到其他地方,STDERR 就不会随之而来。它继续去往 STDOUT 之前去的地方。这就是为什么在第一个示例中,STDOUT 和 STDERR 都会到达相同的位置,但在第二个示例中则不会。

答案2

在第一个命令行上,shell 首先看到 >> file 并将 stdout 附加到 file 。接下来 2>&1 将 fd2 ( stderr ) 发送到 fd1 要去的相同位置 - 即文件。这就是你想要的。

在第二个命令行上,shell 首先看到 2>&1。这意味着“使标准错误(文件描述符 2)到达与标准输出(fd1)相同的位置。”没有任何效果,因为 fd2 和 fd1 都已经进入终端。然后 >> file 将 fd1 (stdout) 追加到 file 。但 fd2 ( stderr ) 仍然会转到终端。

答案3

>> 追加stdout(流#1)到文件。

2>&1将 stderr(流 #2)与 stdout(流 #1)组合(将 stderr 添加到 stdout)

>将 stdout(流 #1)写入文件,覆盖该文件。

1>将 stdout(流 #1)写入文件,覆盖该文件。与上面相同。

2>将 stderr(流#2)写入文件,覆盖该文件。

+++

您的第一个示例将 stdout 附加到文件,然后将 stderr 添加到 stdout。

您的第二个示例将 stderr 添加到 stdout,然后附加合并的stdout(包括 stderr)到文件。

相关内容