2>&1 在shell脚本中有什么用

Nis*_*ava 1 shell scripting

在 shell 脚本中,1 is file descriptor for standard output2 is for standard error. 现在,由于这两者都指向控制台 2>&1. 他们不是已经指向同一个设备了吗?

Dav*_*ica 5

简短的回答是您正在重定向stderr到,stdout因此您将同时收到写入的错误消息FD2以及FD1写入FD1. (FD = 文件描述符)。它通常允许您捕获要保存在日志文件等中的错误消息的输出,否则仅通过重定向stdout到日志就无法捕获这些输出。

作为简要背景,您的 shell 有 3 个众所周知的文件描述符,涵盖基本的读写:

0 - 标准输入(您的输入缓冲区)

1 - stdout(您的正常输出描述符)

2 - stderr(您的正常错误描述符)

当你读或写时,几乎任何编程语言,包括你的 shell,都会使用这些通用的文件描述符来管理输入/输出。在您的 shell 中,您可以重定向或组合来自stdout和 的输出stderr。一般格式为:

m > &n    ## where n & m are 1, 2
Run Code Online (Sandbox Code Playgroud)

例如,您可以将stdoutstderrfrom 任何命令组合到一个文件中:

./someprogram > myfile 2>&1
Run Code Online (Sandbox Code Playgroud)

这基本上是说,“将输出从someprogramonstdout重定向到myfile同时包含stderrstdout.

有几个很好的参考资料,其中一个是BASH Programming - Introduction HOW-TO: All about redirection

注意:请确保您还了解重定向可以临时(基于每个命令)发生,也可以使用exec.