为什么捕获docker run的版本输出需要添加2>&1重定向?
核心原因
1. Shell 标准流与命令替换的规则
Linux 进程默认存在3个标准IO流:
- 0:标准输入(stdin),用于接收外部输入
- 1:标准输出(stdout),默认输出程序正常运行的业务结果
- 2:标准错误(stderr),默认输出程序运行的错误、提示类信息
Shell 的var=$(command)命令替换语法,默认仅会捕获命令的*标准输出(文件描述符1)*内容,标准错误的内容会直接输出到终端,不会被存入变量。
2. nginx 版本信息的输出逻辑
nginx 的-version参数返回的版本号属于提示类信息,官方设计为输出到*标准错误(文件描述符2)*而非标准输出,避免版本信息混入程序正常运行的输出结果中影响业务逻辑。
所以不加重定向时,版本信息会直接打印到终端,变量version无法捕获到任何内容。
3. 2>&1的作用
2>&1是 Shell 重定向规则,作用是将文件描述符2(标准错误)的输出目标,重定向到与文件描述符1(标准输出)完全相同的位置。
添加该规则后,原本输出到标准错误的nginx版本信息,会和标准输出一起进入命令替换的捕获缓冲区,最终就能被正常存入version变量。
内容的提问来源于stack exchange,提问作者minh ly
相关产品推荐
相关产品推荐

