4m1*_*4j1 8 shell io-redirection 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
Run Code Online (Sandbox Code Playgroud)
知道我想把脚本的标准输出和执行错误放在日志文件中。如果没有差异,如果我想记录日志本身怎么办?
phe*_*mer 15
是,有一点不同。
/home/user/script.sh >> /home/user/stdout_and_error.log 2>&1
Run Code Online (Sandbox Code Playgroud)
这会将 STDOUT 和 STDERR 发送到/home/user/stdout_and_error.log.
/home/user/script.sh 2>&1 >> /home/user/stdout_and_error.log
Run Code Online (Sandbox Code Playgroud)
这会将 STDOUT 发送到/home/user/stdout_and_error.log,并将 STDERR发送到之前的 STDOUT。
执行 shell 重定向时,重定向的左侧会转到重定向右侧当前所在的位置。意思是2>&1,它将 STDERR (2) 发送到 STDOUT (1) 当前去的地方。
但是,如果您之后将 STDOUT 重定向到其他地方,则 STDERR 不会随之而来。它继续去往 STDOUT 之前去的地方。这就是为什么在你的第一个例子中, STDOUT 和 STDERR 都会去同一个地方,但在第二个例子中他们不会。
在第一个命令行上,shell 首先看到 >> file 并将 stdout 附加到 file 。接下来 2>&1 将 fd2 ( stderr ) 发送到 fd1 要去的同一个地方——也就是文件。这就是你想要的。
在第二个命令行上,shell 首先看到 2>&1。这意味着“使标准错误(文件描述符 2)与标准输出(fd1)所在的位置相同。” 没有效果,因为 fd2 和 fd1 都已经进入终端。然后 >> file 将 fd1 (stdout) 附加到 file 。但是 fd2 ( stderr ) 仍然会进入终端。
| 归档时间: |
|
| 查看次数: |
24249 次 |
| 最近记录: |