`
truemylife
  • 浏览: 230621 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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

阅读更多

 

原文地址:http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html

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

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

 

linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error output 2

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

 

对于任何一条linux 命令执行,它会是这样一个过程:

image

一个命令执行了:

先有一个输入:输入可以从键盘,也可以从文件得到

命令执行完成:成功了,会把成功结果输出到屏幕:standard output默认是屏幕

命令执行有错误:会把错误也输出到屏幕上面:standard error默认也是指的屏幕

 

文件输入输出由追踪为一个给定的进程所有打开文件的整数句柄来完成。这些数字值就是文件描述符。最为人们所知的文件米描述符是 stdin, stdoutstderr,文件描述符的数字分别是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分别是标准输出,错误输出。

实例:

 
  1. #显示当前目录文件 test.sh test1.sh test1.sh实际不存在
  2. [chengmo@centos5 shell]$ ls test.sh test1.sh
  3. ls: test1.sh: 没有这个文件和目录
  4. test.sh
  5. #正确输出与错误输出都显示在屏幕了,现在需要把正确输出写入suc.txt
  6. # 1>可以省略,不写,默认所至标准输出
  7. [chengmo@centos5 shell]$ ls test.sh test1.sh 1>suc.txt
  8. ls: test1.sh: 没有这个文件和目录
  9. [chengmo@centos5 shell]$ cat suc.txt
  10. test.sh
  11.  
  12. #把错误输出,不输出到屏幕,输出到err.txt
  13. [chengmo@centos5 shell]$ ls test.sh test1.sh 1>suc.txt 2>err.txt
  14. [chengmo@centos5 shell]$ cat suc.txt err.txt
  15. test.sh
  16. ls: test1.sh: 没有这个文件和目录
  17. #继续追加把输出写入suc.txt err.txt  “>>”追加操作符
  18. [chengmo@centos5 shell]$ ls test.sh test1.sh 1>>suc.txt 2>>err.txt
  19.  
  20. #将错误输出信息关闭掉
  21. [chengmo@centos5 shell]$ ls test.sh test1.sh 2>&-
  22. test.sh
  23. [chengmo@centos5 shell]$ ls test.sh test1.sh 2>/dev/null
  24. test.sh
  25. #&[n] 代表是已经存在的文件描述符,&1 代表输出 &2代表错误输出 &-代表关闭与它绑定的描述符
  26. #/dev/null 这个设备,是linux 中黑洞设备,什么信息只要输出给这个设备,都会给吃掉
  27.  
  28. #关闭所有输出
  29. [chengmo@centos5 shell]$ ls test.sh test1.sh  1>&- 2>&-
  30. #关闭 1 ,2 文件描述符
  31. [chengmo@centos5 shell]$ ls test.sh test1.sh  2>/dev/null 1>/dev/null
  32. #将1,2 输出转发给/dev/null设备
  33. [chengmo@centos5 shell]$ ls test.sh test1.sh >/dev/null 2>&1
  34. #将错误输出2 绑定给 正确输出 1,然后将 正确输出 发送给 /dev/null设备  这种常用
  35. <p>[chengmo@centos5 shell]$ ls test.sh test1.sh &>/dev/null
  36. #& 代表标准输出 ,错误输出 将所有标准输出与错误输出 输入到/dev/null文件
 

 

注意:

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

2、“>>”操作符,判断右边文件,如果不存在,先创建。以添加方式打开文件,会分配一个文件描述符[不特别指定,默认为1,2]然后,与左边的标准输出(1)或错误输出(2) 绑定。

3、当命令:执行完,绑定文件的描述符也自动失效。0,1,2又会空闲。

4、一条命令启动,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符。

5、一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行

  • 输入重定向

格式:

command-line [n] <file或文件描述符&设备

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

实例:

 
  1. [chengmo@centos5 shell]# cat > catfile
  2. testing
  3. cat file test
  4. #这里按下 [ctrl]+d 离开
  5. #从标准输入【键盘】获得数据,然后输出给catfile文件
  6.  
  7. [chengmo@centos5 shell]$ cat>catfile <test.sh
  8. #cat 从test.sh 获得输入数据,然后输出给文件catfile
  9.  [chengmo@centos5 shell]$ cat>catfile <<eof
  10. test a file
  11. test!
  12. eof
  13.  #<< 这个连续两个小符号, 他代表的是『结束的输入字符』的意思。这样当空行输入eof字符,输入自动结束,不用ctrl+D
 

 

格式:

exec 文件描述符[n] <或> file或文件描述符或设备

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

实例:

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

说明:使用前先将标准输入保存到文件描述符6,这里说明下,文件描述符默认会打开0,1,2 还可以使用自定义描述符 。然后对标准输出绑定到文件,接下来所有输出都会发生到文件。 使用完后,恢复标准的输出,关闭打开文件描述符6。

有趣事情:

可能有朋友会这样用:exec 1>suc.txt ,接下来所有输出都绑定到suc.txt 文件,那么怎么样恢复原来的呢? 试试你就会发现问题所在……

了解exec、source、fork的区别

  • 复杂一点实例
 
 
  1. exec 3<>test.sh;
  2. #打开test.sh可读写操作,与文件描述符3绑定
  3.  while read line<&3
  4.  do
  5.     echo $line;
  6. done
  7. #循环读取文件描述符3(读取的是test.sh内容)
  8. exec 3>&-
  9. exec 3<&-
  10. #关闭文件的,输入,输出绑定
 

 

  • 总结下:

学习就要总结,总结才可以提高了。哈哈!

估计还有一些朋友是头晕晕的。怎么linux的重定向这么复杂呢,又是文件打开描述符又是读,还有些,还有默认标准输入输出。

其实,总结一下,重定向应用通常就以下两点:

1、重新设置命令的默认输入,输出,指向到自己文件(文件,文件描述符,设备其实都是文件,因为linux就是基于设备也是文件,描述符也指向是文件,哈哈)

2、扩展自己新的描述符,对文件进行读写操作

分享到:
评论

相关推荐

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

    Linux Shell 数据重定向是Linux操作系统中一种强大的功能,它允许用户改变命令的默认输入来源或输出目的地,使得命令的执行结果不再输出到终端,而是保存到文件或进行其他处理。在深入探讨之前,我们首先需要了解...

    Linux 命令 shell 重定向 >

    在Linux操作系统中,Shell是用户与系统交互的接口,它提供了...理解并熟练掌握Shell重定向,对于Linux系统的管理和自动化运维来说至关重要,它能帮助你更高效地处理日常任务,避免不必要的手动操作,提高工作效率。

    LINUX Shell 输入-输出重定向.pdf

    在Linux系统中,输入输出重定向是一项非常重要的功能,它允许用户改变程序或命令的输入来源或输出目标,从而实现更灵活的数据处理方式。本文将深入探讨Linux Shell中的输入-输出重定向的基本概念、常用符号以及实际...

    Linux shell编程实战:输入输出重定向与变量操作

    内容概要:本文详细介绍了Linux shell脚本编程中的几个核心知识点,包括输入输出重定向、Shell变量操作、基本的Shell编程技巧以及简单的算术运算方法。每个知识点都有详细的命令演示和具体的应用实例,帮助读者更好...

    Linux下重定向详解

    - **处理顺序**:在I/O重定向中,标准输出和标准错误输出的管道会优先准备,然后再从标准输入读取数据。 - **管道** (`|`):允许上一个命令的标准输出作为下一个命令的标准输入。 - **tee命令**:可以在不影响原本I/...

    Linux系统教程 标准输入/输出和重定向

    Linux 系统中标准输入/输出和重定向是两个非常重要的概念,它们在 Linux 系统中扮演着非常重要的角色,本文将对 Linux 系统中的标准输入/输出和重定向进行详细的介绍。 标准输入/输出 ----------------- 在 Linux ...

    linux中的重定向.pdf

    例如,"exec 3&lt;&gt; inputfile"会创建一个新的文件描述符3,用于输入输出操作。 11. 当需要执行更复杂的I/O重定向时,可以结合使用管道("|")、重定向和文件描述符。例如,"cmd1 | cmd2 | cmd3 &gt; file"这条命令会先将...

    linux中的重定向问题

    通过使用`system()`函数或`exec()`家族函数,我们可以灵活地控制命令的输入输出流,从而实现更复杂的功能。此外,通过高级函数如`getdelim()`,还可以处理包含特殊字符的输入数据,进一步扩展了我们的编程能力。希望...

    Shell的使用及管道与重定向

    重定向则允许用户改变命令的标准输入输出位置,如将输出重定向到文件中,或者从文件中读取输入。例如,“command &gt; file”命令会将命令的输出重定向到名为file的文件中,而“command ”则会将file文件的内容作为命令...

    linux下输入输出重定向.docx

    Linux下的输入输出重定向 Linux下的输入输出重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变。默认情况下,Linux的输入是键盘,输出是显示器。但是,我们可以使用重定向来改变这些设置。 ...

    Shell 输入输出重定向.doc

    大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,...

    Shell 输入输出重定向命令解析.doc

    Shell 输入/输出重定向是Unix和Linux系统中的一项核心功能,允许用户改变命令的默认行为,即从终端接收输入和返回输出。理解这一概念对于高效地管理操作系统和编写脚本至关重要。 首先,我们讨论文件描述符。在...

    [Ubuntu.Linux.基础视频教程].4.4.Shell.输入输出重定向

    本教程重点讲解的是Shell的输入输出重定向功能,这是Linux命令行操作中的一个重要概念,对于提升效率和自动化任务处理有着重要作用。 首先,我们要理解Shell的默认行为:屏幕输出(stdout)和错误输出(stderr)。...

    cmd 和shell的重定向功能.docx

    重定向时,我们可以通过指定句柄号来精确控制输入输出的位置。 在Shell中,重定向的概念类似,但操作符可能略有不同。例如,`&gt;`和`&gt;&gt;`在Shell中同样用于输出重定向,`用于输入重定向,而`|`也是管道。然而,Shell...

    Linux base shell重定向详解

    一、标准输入,标准输出与标准错误输出 在linux shell执行命令时,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名: 文件 文件...

    linux shell 管道命令(pipe)使用及与shell重定向区别

    看了前面一节:linux shell数据重定向(输入重定向与输出重定向)详细分析 估计还有一些朋友是头晕晕的,好复杂的重定向了。这次我们看下管道命令了。shell管道,可以说用法就简单多了。 管道命令操作符是:”|”,它...

    Shell中重定向的深入讲解

    在Shell脚本编程中,重定向是一个至关重要的概念,它允许我们改变命令的...在实际工作中,根据需要调整输入输出,可以极大地提高自动化任务的效率和可靠性。不断实践和探索,你会发现更多Shell重定向的高级用法和技巧。

    练习shell变量、重定向、管道等相关命令

    在Linux和Unix系统中,Shell脚本是一种非常强大的工具,用于自动化任务处理、系统管理和数据处理等。熟练掌握Shell中的变量、重定向和管道操作对于提高工作效率至关重要。接下来,我们将详细探讨这些概念及其应用。 ...

    北邮linux开发环境实验报告

    文档如"Linux实验三.doc"、"上机实验3.docx"、"上机实验1.docx"和"上机实验4.docx"可能详细记录了学生们如何运用Shell管道和重定向功能,以及他们如何收集和分析TCP活动数据的过程。 通过这个实验,学生不仅掌握了...

Global site tag (gtag.js) - Google Analytics