当 stderr 在 stdout 之后重定向时会发生什么?

use*_*169 1 bash shell pipe

stderr当重定向之后会发生什么stdout,反之亦然?

例如:

someCommand > log.txt 2>&1

someCommand 2>&1 > log.txt

mar*_*iux 5

重定向按照出现的顺序完成:

someCommand > log.txt 2>&1
Run Code Online (Sandbox Code Playgroud)
  • stdout 是文件描述符 1fd(1) == stdout
  • stderr 是文件描述符 2fd(2) == stderr
  • 将文件描述符 1 重定向到log.txt结果fd(1) == log.txt
  • 将文件描述符 2 重定向到文件描述符 1 会导致fd(2) == fd(1) == log.txt
  • 导致写入文件描述符 1 或 2 的所有内容实际上都写入 log.txt。

someCommand 2>&1 > log.txt
Run Code Online (Sandbox Code Playgroud)
  • stdout 是文件描述符 1fd(1) == stdout
  • stderr 是文件描述符 2fd(2) == stderr
  • 将文件描述符 2 重定向到文件描述符 1 会导致fd(2) == fd(1) == stdout
  • 将文件描述符 1 重定向到log.txt结果fd(1) == log.txt
  • 导致写入文件描述符 1 的所有内容实际上都写入 log.txt
  • 写入文件描述符 2 的所有内容实际上都写入 stdout