Linux的I/O重定向执行结果解惑(执行顺序)

原文: 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语言的角度来理解。第二 最终很清晰的描述整个过程。 不至于胡乱猜测。