近日在网上看题时遇到这么一条题目:
下面两条命令分别会有怎样的输出
echo hello 1>&2 | grep aaa
echo hello 2>&1 | grep aaa
A、两个均输出hello
B、第一个无输出,第二个输出 hello
C、第一个输出hello,第二个无输出
D、两个均输出hello
正确答案是 C
这题的考点包括 文件描述符、重定向、管道符 以及 grep
- 文件描述符
题中的 1 和 2 就是 LInux 系统中的 文件描述符
常见的有 0、1 和 2
0 表示 stdin , 标准输入
1 表示 stdout , 标准输出
2 表示 strerr , 标准错误输出 - 重定向
> 表示 输出重定向, 本来输出至屏幕等输出设备的信息可以重新指定其输出目标
比如who > users
会将 who 命令的输出到当前目录下的 users 文件中
< 表示 输入重定向, 本来由键盘接收的输入可以指定文件作为输入源
比如wc -l < users
表示将 users 中的内容当做标准输入传递给 wc 命令
综上
1>&2 表示 将标准输出重定向至标准错误输出
同理, 2>&1 表示 将标准错误输出
而 管道符( | ) 负责传递左边命令的 stdout 为 右边命令的 stdin
echo hello 1>&2
最终输出信息类型为 stderr , 管道符不会对其进行传递, grep aaa
没有找到对应字符串, 无输出
最终输出 为 左边命令的 stderr , 即 hello
echo hello 2>&1
最终输出信息则为 stdout , 管道符对其传递, grep aaa
没有找到对应字符串, 无输出
最终输出 没有任何信息
关于 文件操作符 的进阶操作可以阅读
Shell exec命令操作文件描述符