本篇讲述linux系统的输入输出、管道和重定向。

1. liunx的输入输出

一个linux系统要想发挥作用,就要有输入输出,这样才可以与外界交互。

类型

设备文件名

文件描述符

设备名称

说明

备注

标准输入

/dev/stdin

0

键盘

程序默认的输入设备

 

标准输出

/dev/stdout

1

当前屏幕

程序默认的输出设备

 

标准错误输出

/dev/stderr

2

当前屏幕

程序默认的错误信息输出设备

 

 

 

 

 

 

2. 输入输出的重定向

有些情况,比如我想把程序的日志输出保存起来,以便后续查看。默认输出是屏幕,而屏幕是有大小的,超了显示的区域之前的日志就不可看了。这时就需要重新定义它的输出位置,就有了重定向。
很容易理解,有输出重定向,就有输入重定向。那么输入输出的重定向怎么定义呢?请看下表:

类型

操作符

例子

说明

输入重定向

<

tac < 123.txt

把123.txt里的内容输入到tac命令,不需要再从键盘接受字符

标准输出重定向

>

ls / > 123.log

把ls / 的输出重定向到123.log文件中,123.log不存在则创建,123.log存在则内容覆盖

标准错误输出重定向

2>

ls /error 2> 123.log

把ls /error的错误输出重定向到123.log文件中,123.log不存在则创建,123.log存在则内容覆盖

输出重定向合并

&>或者2>&1

ls / /error &> 123.log

把ls / /error的标准输出和标准错误输出都重定向到123.log文件中,123.log不存在则创建,123.log存在则内容覆盖

追加

>>

 

把上述>变成>>,文件存在则追加到末尾,避免上述文件存在被覆盖的情况

 

 

 

 

 

 

  

 

补充说明一下:
合并重定向的2>&1这种方式,看下面的例子:

centos 所有日志重定向 linux 日志重定向输出_重定向

发现把2>&1放置在前面的话,错误输出并没有保存到456.log中,而还是打印在屏幕上。把2>&1放置在后面的话,错误输出就保存到123.log中,而没有打印在屏幕上。这是为什么呢?
解答:2>&1,它是把错误输出重定向为标准输出。位置不同逻辑顺序就不同。
放置在前面的话,就先把2转成1,而1默认是在屏幕上显示的,然后再定义1保存到文件中,而这时2已经转化为1在屏幕中输出过了。
放置在后面的话,就先定义1保存到文件中,然后把2变成1,而此时1已经定义重定向到文件中了。

3. 管道

管道是linux中一个重要的概念,在linux中用“|”表示,他可以把前一个命令的输出结果当成下一个命令的输入,经过组合,可以方便的得出我们想要的结果。
比如,我想查找/tmp目录下3分钟之内创建的名字包含“abc”的文件或目录,则可以用:

centos 所有日志重定向 linux 日志重定向输出_centos 所有日志重定向_02

它就把find出来的结果当成grep的输入了。

这里也补充说明一下:管道只能接受标准输出,而不能接受标准错误输出。如下:

centos 所有日志重定向 linux 日志重定向输出_输出重定向_03