TangWei's Studio

浅谈几种IO重定向变形用法

Word count: 1,101 / Reading time: 4 min
2018/04/05 Share

浅谈几种IO重定向变形用法

一、简介

首先,我们来认识一下linux系统中的几种标准输入和输出

什么是标准输入和输出呢?

Linux给程序提供了三种I/O设备,即:

  • 标准输入(STDIN) 0 默认接受来自键盘的输入

  • 标准输出(STDOUT) 1 默认输出到终端窗口

  • 标准错误(STDERR) 2 默认输出到终端窗口

同时linux中使用“>”和“>>”将标准输出和标准错误重新定向到文件中:

  • “>”后跟重定向文件,文件内容会被覆盖

  • > 把标准输出重定向到文件

  • 2> 把标准错误重定向到文件

  • &> 把标准输出和错误都定向到文件

  • 1>&2 把标准输出定向到标准错误(简单来讲,对的变成错的)

  • 2>&1 把标准错误定向到标准标准输出(错的变成对的)

  • “>>”后跟重定向文件,是在原有内容基础上,追加内容

  • >> 追加标准输出重定向到文件

  • 2>> 追加标准错误重定向到文件

  • &>> 追加标准输出和错误都定向到文件

那么下面我们来讨论下几种重定向的变形用法:

首先我们先建file1-6的6个空文件
enter image description here
这里我们看到:

ll /data/f1 显示标准输出(f1文件详细信息);

ll /erorr 显示标准错误(提示无此目录);
enter image description here

二、实验

实验1

1
ll /data/f1 /erorr > /data/file1 2>&1

enter image description here

结果:屏幕无显示,标准输出和标准错误输入到file1文件中

实验2

1
ll /data/f1 /erorr 2>&1 > /data/file2

enter image description here

结果:屏幕显示标准错误,标准输出输入到file2文件中

实验3

1
ll /data/f1 /erorr 2> /data/file3 1>&2

enter image description here

结果:屏幕无显示,标准输出和标准错误输入到file3文件中

实验4

1
ll /data/f1 /erorr 1>&2 > /data/file4

enter image description here

结果:屏幕显示标准错误,标准输出输入到file4文件中

实验5

1
ll /data/f1 /erorr > /data/file5

enter image description here

结果:屏幕显示标准错误,标准输出输入到file5文件中

实验6

1
ll /data/f1 /erorr > /data/file6 1>&2

enter image description here

结果:屏幕显示标准输出和标准错误,file6文件为空

总结

观察6个小实验我们发现:

实验1,3得出的结果完全相同,屏幕无显示,标准输出和标准错误输入到file文件中。得出此结果也有两种

执行顺序的可能性:

  • 可能性1:实验1可看做,标准输出先重定向到file文件中,标准错误然后重定向为标准输出再次重定向到file文件中;实验3可看做,标准错误先重定向到file文件中,标准输出然后重定向为标准错误再次重定向到file文件中,所以file文件中既有标准输入又有标准输出。

  • 可能性2:实验1可看做,标准输出和错误都经过2>&1的重定向后,全变为标准输出,再输入进file1件中;实验3可看做,标准输出和错误都经过1>&2的重定向后,全变为标准错误,再输入file3文件中。于是我们有了实验6,ll /data/f1 /erorr > /data/file6 1>&2,得出结果屏幕显示标准输出和标准错误,file6文件为空,由此可认为实验6执行了可能性2的执行过程。

结论1:当有1>&2或2>&1处于重定向组合命令结尾时,输出结果全部先执行1>&2或2>&1,再执行前面的重定向。

实验2,4,5得出的结果完全相同,即屏幕显示标准错误,标准输出输入到file5文件中

三条命令分别为:

1
ll /data/f1 /erorr 2>&1 > /data/file2
1
ll /data/f1 /erorr 1>&2 > /data/file4
1
ll /data/f1 /erorr > /data/file5

我们是否可以这样认为:

结论2:当2>&1或1>&2处在重定向组合命令中间位置时,2>&1或1>&2是不起作用的,可以忽略掉(此结论待定)

现在再来看这个问题

下列哪个标准输出结果与其他选项不同:( )

A.cmd >log 2>&1

B.cmd 2>&1 >log

C.cmd &> log

D,cmd 2>log 1>&2

小伙伴们,现在用以上结论去做这道题,是不是很easy了呢

CATALOG
  1. 1. 浅谈几种IO重定向变形用法
    1. 1.1. 一、简介
    2. 1.2. 二、实验
      1. 1.2.1. 实验1
      2. 1.2.2. 实验2
      3. 1.2.3. 实验3
      4. 1.2.4. 实验4
      5. 1.2.5. 实验5
      6. 1.2.6. 实验6
    3. 1.3. 总结