码迷,mamicode.com
首页 > 系统相关 > 详细

linux的输入输出重定向和管道

时间:2016-07-31 22:49:13      阅读:328      评论:0      收藏:0      [点我收藏+]

标签:管道   输入输出重定向   

1. 在了解重定向之前,我们先来看看linux 的文件描述符。

linux文件描述符:可以理解为linux为了跟踪打开文件,而分配的一个数字,(人是根据文件名追踪文件,系统则是根据文件描述符),这个数字有点类似c语言操作文件时候的指针,通过指针就可以实现文件的读写操作。 用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit –n 定义数字有关系,不能超过最大值。

linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error output 2以后打开文件后。新增文件绑定描述符可以依次增加。 一条shell命令执行,都会继承父进程的文件描述符。因此,所有运行的shell命令,都会有默认3个文件描述符。


Linux 给程序提供三种I/O 设备

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

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

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


对于任何linux命令的执行都有下面的过程:

技术分享


 

一条命令的执行需要键盘等的标准输入,命令的执行,和正确或错误,其中的每一个双向箭头就是一个通道,所以数据流既可以流入到文件(就是重定向或管道),也可以流出到屏幕如果命令所需的输入不是来自键盘,而是来自指定的文件,这就是输入重定向。同理,命令的输出也可以不显示在屏幕上,而是写入到指定文件中,这就是输出重定向。

 

 重定向符号

>   输出重定向到一个文件或设备 覆盖原来的文件

>!  输出重定向到一个文件或设备 强制覆盖原来的文件

>>  输出重定向到一个文件或设备 追加原来的文件

<   输入重定向到一个程序

2. 标准错误重定向符号

2>  将一个标准错误输出重定向到一个文件或设备覆盖原来的文件  b-shell

2>>  将一个标准错误输出重定向到一个文件或设备追加到原来的文件

2>&1将一个标准错误输出重定向到标准输出 注释:1就是代表标准输出

>&  将一个标准错误输出重定向到一个文件或设备覆盖原来的文件  c-shell

|&  将一个标准错误管道输出到另一个命令作为输入

 

接下来看看标准输入/输出重定向在构造一条Linux命令中的实际应用。

 

3. 输入重定向和输出重定向


[root@centos7 testdir]# wc aa.txt //命令等于 wc< aa.txt 但是一般都简写成前者

[root@centos7 testdir]# ls >ls_file.txt


第一条命令将文件aa.txt作为wc命令的输入,统计出aa.txt的行数、单词数和字符数。第二条命令将ls命令的输出保存在一个名为ls_file.txt的文件中。如果>符号后边的文件已存在,那么这个文件将被重写。

 

利用管道

利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。下面来看看管道是如何在构造一条Linux命令中得到应用的。

 

 

4.利用管道将前面命令的标准输入和标准错误都输入到wc –l进行统计行数

[root@centos7 testdir]# ls

a.txt  

[root@centos7 testdir]# ll a.txt b.txt |& wc -l

2


5.将标准输入和标准错误分别进行保存至文件corr.log 和err.log

 [root@centos7testdir]# ls
 
a.txt  

 [root@centos7 testdir]#ll a.txt b.txt |& wc -l
 
2

[root@centos7 testdir]# ll a.txt b.txt >>corr.log   2>> err.log

[root@centos7 testdir]# ll

total 20

-rw-r--r--. 1 root root 136 Jul 30 16:11 a.txt

-rw-r--r--. 1 root root 47 Jul 30 20:46 corr.log

-rw-r--r--. 1 root root 51 Jul 30 20:46 err.log

 [root@centos7testdir]# cat corr.log
 
-rw-r--r--. 1 root root 136 Jul 30 16:11 a.txt

[root@centos7 testdir]# cat err.log 

ls: cannot access b.txt: No such file or directory

 

6.将标准输出和错误输出到同一个文件:

[root@centos7 testdir]# ll a.txt b.txt >>all.log   2>&1

[root@centos7 testdir]# ll a.txt b.txt &>>all2.log  

[root@centos7 testdir]# cat all2.log 

ls: cannot access b.txt: No such file or directory

-rw-r--r--. 1 root root 136 Jul 30 16:11 a.txt

[root@centos7 testdir]# cat all.log 

ls: cannot access b.txt: No such file or directory

-rw-r--r--. 1 root root 136 Jul 30 16:11 a.txt


  注意:上面的两种方法都行,前者是rhel5以前的版本都支持,&>>是较新的写法


7. 多行重定向:

[root@centos7 ~]#mail -s "this is jack_cui send mail to root" root << enf

> hello root

> this is testmail to

 you
 
> enf


其中enf是文本结束标识符,可以自己定义文本结束标识符

 


本文出自 “jackcui” 博客,转载请与作者联系!

linux的输入输出重定向和管道

标签:管道   输入输出重定向   

原文地址:http://jackcui.blog.51cto.com/11877206/1832389

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!