这两条线有区别吗?
/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)到文件。