在了解重定向之前,我们先来看看linux 的文件描述符。
linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit –n 定义数字有关系,不能超过最大值。
linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error output 2

以后打开文件后。新增文件绑定描述符可以依次增加。一条shell命令执行,都会继承父进程的文件描述符。因此,所有运行的shell命令,都会有默认3个文件描述符。

对于任何一条linux 命令执行,它会是这样一个过程:
file -----Standard input------->Command------Standard output-----> file/device
键盘               |
                |
            Standard error
                |
                |
              file/devic
一个命令执行了:
先有一个输入:输入可以从键盘,也可以从文件得到
命令执行完成:成功了,会把成功结果输出到屏幕:standard output默认是屏幕
命令执行有错误:会把错误也输出到屏幕上面:standard error默认也是指的屏幕

文件输入输出由追踪为一个给定的进程所有打开文件的整数句柄来完成。这些数字值就是文件描述符。最为人们所知的文件米描述符是
stdin, stdout 和stderr,文件描述符的数字分别是0,1和2。这些数字和各自的设备是保留的。
一个命令执行前,先会准备好所有输入输出,默认分别绑定(stdin,stdout,stderr),如果这个时候出现错误,命令将终止,不会执行。
命令解析过程,可以参考:Linux Shell 通配符、元字符、转义符使用实例介绍

这些默认的输出,输入都是linux系统内定的,我们在使用过程中,有时候并不希望执行结果输出到屏幕。我想输出到文件或其它设备。
这个时候我们就需要进行输出重定向了。

linux shell下常用输入输出操作符是:
1.标准输入(stdin) :代码为0 ,使用< 或<<; /dev/stdin ->/proc/self/fd/0 0代表:/dev/stdin
2.标准输出(stdout):代码为1 ,使用> 或>>; /dev/stdout ->/proc/self/fd/1 1代表:/dev/stdout
3.标准错误输出(stderr):代码为2 ,使用2> 或2>>; /dev/stderr ->/proc/self/fd/2 2代表:/dev/stderr

输出重定向:
格式:
command-line1 [1-n] > file或文件操作符或设备

上面命令意思是:将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的) 重定向其它输出设备(文件,打开文件操作符,或打印机等等)
1,2分别是标准输出,错误输出。
实例:
#显示当前目录文件test.sh test1.sh test1.sh实际不存在 [chengmo@centos5 shell]$ ls test.sh test1.sh
ls: test1.sh: 没有这个文件和目录 test.sh
#正确输出与错误输出都显示在屏幕了,现在需要把正确输出写入suc.txt
# 1>可以省略,不写,默认所至标准输出[chengmo@centos5 shell]$ ls test.sh test1.sh 1>suc.txt
ls: test1.sh: 没有这个文件和目录 [chengmo@centos5 shell]$ cat suc.txt test.sh
#把错误输出,不输出到屏幕,输出到err.txt [chengmo@centos5 shell]$ ls test.sh test1.sh 1>suc.txt 2>err.txt [chengmo@centos5 shell]$ cat suc.txt err.txt
test.sh
ls: test1.sh: 没有这个文件和目录
#继续追加把输出写入suc.txt err.txt “>>”追加操作符 [chengmo@centos5 shell]$ ls test.sh test1.sh 1>>suc.txt 2>>err.txt
#将错误输出信息关闭掉[chengmo@centos5 shell]$ ls test.sh test1.sh 2>&- test.sh

[chengmo@centos5 shell]$ ls test.sh test1.sh 2>/dev/null test.sh
#&[n] 代表是已经存在的文件描述符,&1 代表输出&2代表错误输出&-代表关闭与它绑定的描述符
#/dev/null 这个设备,是linux 中黑洞设备,什么信息只要输出给这个设备,都会给吃掉
#关闭所有输出

[chengmo@centos5 shell]$ ls test.sh test1.sh 1>&- 2>&-
#关闭1 ,2 文件描述符

[chengmo@centos5 shell]$ ls test.sh test1.sh 2>/dev/null 1>/dev/null
#将1,2 输出转发给/dev/null设备 [chengmo@centos5 shell]$ ls test.sh test1.sh >/dev/null 2>&1
#将错误输出2 绑定给正确输出1,然后将正确输出发送给/dev/null设备这种常用
<P>[chengmo@centos5 shell]$ ls test.sh test1.sh &>/dev/null
#& 代表标准输出,错误输出将所有标准输出与错误输出输入到/dev/null文件

注意:

1、shell遇到”>”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新文件。不存在直接创建。无论左边命令执行是否成功。右边文件都会变为空。

2、“>>”操作符,判断右边文件,如果不存在,先创建。以添加方式打开文件,会分配一个文件描述符[不特别指定,默认为1,2]然后,与左边的标准输出(1)或错误输出(2) 绑定。
3、当命令:执行完,绑定文件的描述符也自动失效。0,1,2又会空闲。
4、一条命令启动,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符。
5、一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行
输入重定向
格式:
command-line [n] <file或文件描述符&设备

将然有,命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入。执行这个命令,将标准输入0,与文件或设备绑 定。将由它进行输入。
实例:

[chengmo@centos5 shell]# cat > catfile testing

cat file test
#这里按下[ctrl]+d 离开
#从标准输入【键盘】获得数据,然后输出给catfile文件 [chengmo@centos5 shell]$ cat>catfile <test.sh
#cat 从test.sh 获得输入数据,然后输出给文件catfile [chengmo@centos5 shell]$ cat>catfile <<eof test a file
test! eof
#<< 这个连续两个小符号, 他代表的是『结束的输入字符』的意思。这样当空行输入eof字符,输入自动结束,不用ctrl+D
exec绑定重定向
格式:
exec 文件描述符[n] <或> file或文件描述符或设备

在上面讲的输入,输出重定向将输入,输出绑定文件或设备后。只对当前那条指令是有效的。如果需要在绑定之后,接下来的所有命令都 支持的话。就需要用exec命令
实例:

[chengmo@centos5 shell]$ exec 6>&1
#将标准输出与fd 6绑定[chengmo@centos5 shell]$ ls /proc/self/fd/ 0 1 2 3 6
# 出 现 文 件 描 述 符 6 [chengmo@centos5 shell]$ exec 1>suc.txt
#将接下来所有命令标准输出,绑定到suc.txt文件(输出到该文件) [chengmo@centos5 shell]$ ls -al
#执行命令,发现什么都不返回了,因为标准输出已经输出到suc.txt文件了 [chengmo@centos5 shell]$ exec 1>&6
#恢复标准输出[chengmo@centos5 shell]$ exec 6>&-
#关闭fd 6描述符[chengmo@centos5 ~]$ ls /proc/self/fd/ 0 1 2 3

说明:使用前先将标准输入保存到文件描述符6,这里说明下,文件描述符默认会打开0,1,2 还可以使用自定义描述符。然后对标准输出绑定到文件,接下来所有输出都会发生到文件。使用完后,恢复标准的输出,关闭打开文件描述符6。
有趣事情:
可能有朋友会这样用:exec 1>suc.txt ,接下来所有输出都绑定到suc.txt 文件,那么怎么样恢复原来的呢? 试试你就会发现问题所在……复杂一点实例

exec 3<>test.sh;
#打开test.sh可读写操作,与文件描述符3绑定 while read line<&3
do echo $line; done
#循环读取文件描述符3(读取的是test.sh内容) exec 3>&-
exec 3<&-
#关闭文件的,输入,输出绑定

怎么linux的重定向这么复杂呢,又是文件打开描述符又是读,还有些,还有默认标准输入输出。其实,总结一下,重定向应用通常就以下两点:
1、重新设置命令的默认输入,输出,指向到自己文件(文件,文件描述符,设备其实都是文件,因为linux就是基于设备也是文件,描述符也指向是文件,哈哈)
2、扩展自己新的描述符,对文件进行读写操作

转载于:https://www.cnblogs.com/luoyan01/p/9734085.html

linux-shell数据重定向详细分析相关推荐

  1. linux shell数据重定向(输入重定向与输出重定向)详细分析

    转载自: linux shell数据重定向(输入重定向与输出重定向)详细分析 - 程默 - 博客园 http://www.cnblogs.com/chengmo/archive/2010/10/20/ ...

  2. linux注册函数机制,Linux可信计算机制模块详细分析之函数实现机制(1)字符设备驱动...

    原标题:Linux可信计算机制模块详细分析之函数实现机制(1)字符设备驱动 2.3 函数实现机制 2.3.1 Linux 字符设备驱动 在linux 3.5.4中,用结构体cdev描述字符设备,cde ...

  3. Linux shell之重定向

    文章目录 前言 一.输出重定向 二.输入重定向 三.重定向原理 总结 前言 我们有些时候想要将命令的输出保存起来,而不仅仅是让它输出到显示器上(终端上).将命令的输出保存再文件中后方便分析输出的内容. ...

  4. Linux命令man echo,Linux Shell man 命令详细介绍

    知道linux帮助文件(man-pages,手册页)一般放在,$MANPATH/man 目录下面,而且按照领域与语言放到不同的目录里面. 看了上一章,要找那个命令使用相关手册,只要我们按照领域区分,到 ...

  5. linux 换行符_「linux」libevent demo详细分析(对比epoll)

    libevent默认情况下是单线程,每个线程有且仅有一个event_base,对应一个struct event_base结构体,以及赋予其上的事件管理器,用来安排托管给它的一系列的事件. 当有一个事件 ...

  6. 【内核】linux内核启动流程详细分析【转】

    转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...

  7. Linux系统开机过程详细分析

    各位是否曾经对电脑整个开机的流程感到好奇呢 ? 这一次 , 我们所要讨论的  主题 , 就是 Linux 从开机的一瞬间到 login 为止 , 到底发生了什么事情 ? 想必各位都知道 , 在刚开机时 ...

  8. linux脚本重定向到输入,linux shell输入输出重定向

    新建一个文本文件包含所需要的脚本.举例,我会使用pico编辑器写一个脚本用来运行程序tar,带上必要的可选项可以用来解压从因特网下载下来的*.tar的文件(我好像总是记不住tar的所有参赛).我决定把 ...

  9. 【内核】linux内核启动流程详细分析

    Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...

最新文章

  1. (MyEclipse) MyEclipse完美破解方法(图)
  2. 《树莓派Python编程入门与实战(第2版)》——3.9 小结
  3. Java并发 正确终止与恢复线程
  4. 肌肉减少症导致的老人跌倒
  5. android resolvesize方法,Android 自定义View中onMeasure()中使用resolveSize()是什么意思?
  6. ActionBar之style出现Cannot resolve symbol 'Theme' 错误
  7. Canvas-drawImage 绘制图片模糊问题
  8. 前馈神经网络——深度学习之神经网络核心原理与算法
  9. 上传jar包到私服(仅限于翼支付公司工作流程使用)和涉及的技术总结
  10. Java实现文件复制
  11. 15款值得开发者一试的最新的前端框架
  12. Oracle系统表大全(转)
  13. webpack(三)使用 babel-loader 转换 ES6代码
  14. (C语言)用C语言编写小游戏——扫雷
  15. 在SPSS中使用广义估算方程对非独立相关数据进行分析的方法
  16. C#数据结构与算法 培训视频
  17. SQL server-数据库的创建
  18. 微信怎么接龙?手把手教你使用微信群接龙功能
  19. 手持PDA和手机有什么区别?
  20. Gateway网关限流

热门文章

  1. AJAX服务器返回数据 连接数据库查询数据
  2. Android初学者教程
  3. BUZZER Driver
  4. 新的开始,连菜鸟都算不上的程序媛
  5. MVC项目开发中那些用到的知识点(登录权限认证)
  6. 将你的前端应用打包成docker镜像并部署到服务器?仅需一个脚本搞定
  7. Python_divmod() 函数简单说明
  8. Java--消除重复数字后的最大值
  9. java创建线程的两种方法区别
  10. react-flux单向数据流