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” 博客,转载请与作者联系!
原文地址:http://jackcui.blog.51cto.com/11877206/1832389