原文: https://blog.csdn.net/xyz_dream/article/details/89547687
面试题
常见面试会考到i/o重定向问题的时候,这个问题问倒了不少人,即使能回答上来的有些是靠猜的。网上看到一篇文章,博主基于作者的思想总结了一点感悟和技巧,来详细解释一下重定向最终执行过程。 如下面的面试题:
问 一下哪个命令执行结果与其他三个不一样 ? 为什么?
1.cmd > log 2>&1
2.cmd 2>&1 > log
3.cmd &> log
4.cmd 2>log >&2
重定向执行过程解释
1.cmd > log 2>&1
我们可以使用”指针”的形式来理解。 首先先确保大家都知道, Linux提供3种i/o设备。
0代表 标准输入(默认:键盘)
1代表 标准输出 (默认: 屏幕)
2代表标准错误 (默认: 屏幕)
我们用”->”代表指针指向。 首先 1->屏幕 然后 执行了 > log等价于(1>log,默认省略1)
那么此时 1->log。 后面的命令 2>& 可以理解问 2执行了1所在的地址(可以理解&符号类似c语言中的取地址符)。 那么此时 由原来的 2->屏幕 变为了 2->log 。 最终结果 :
1->log 2->log
2.cmd 2>&1 > log
由上面的推导过程继续看该条命令。 原来1->屏幕, 2>&1 表示 2指向1所在的地址 也就是 2->屏幕 。 接着命令 >log ,表示 1指向 log。 最后结果:
2->屏幕 1->log
3.cmd &> log
这个命令就不用解释了,官方提供的,直接用就是了。他代表的意思 ,把标准输出和标准错误都重定向到log文件。 最终结果:
1->log 2->log
4.cmd 2>log >&2
原来 1->屏幕。 2>log 表示 2指向log 也就是 2->log , >&2 表示 1指向2所在的地址,意思就是 1也指向了log(因为2所在的地址是log)。 最终结果:
2->log 1->log
总结
面试答案显然可以知道是 第2条命令与其余命令不同。 其余3条命令 2和 1都指向 log。这样理解的话,第一是将&暂时解释为取地址符,符合大多数人用c语言的角度来理解。第二 最终很清晰的描述整个过程。 不至于胡乱猜测。