linux shell数据重定向

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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

#显示当前目录文件 test.sh test1.sh test1.sh实际不存在

[[email protected] shell]$ ls test.sh test1.sh

ls: test1.sh: 没有这个文件和目录

test.sh

#正确输出与错误输出都显示在屏幕了,现在需要把正确输出写入suc.txt

# 1>可以省略,不写,默认所至标准输出

[[email protected] shell]$ ls test.sh test1.sh 1>suc.txt

ls: test1.sh: 没有这个文件和目录

[[email protected] shell]$ cat suc.txt

test.sh

#把错误输出,不输出到屏幕,输出到err.txt

[[email protected] shell]$ ls test.sh test1.sh 1>suc.txt 2>err.txt

[[email protected] shell]$ cat suc.txt err.txt

test.sh

ls: test1.sh: 没有这个文件和目录

#继续追加把输出写入suc.txt err.txt  “>>”追加操作符

[[email protected] shell]$ ls test.sh test1.sh 1>>suc.txt 2>>err.txt

#将错误输出信息关闭掉

[[email protected] shell]$ ls test.sh test1.sh 2>&-

test.sh

[[email protected] shell]$ ls test.sh test1.sh 2>/dev/null

test.sh

#&[n] 代表是已经存在的文件描述符,&1 代表输出 &2代表错误输出 &-代表关闭与它绑定的描述符

#/dev/null 这个设备,是linux 中黑洞设备,什么信息只要输出给这个设备,都会给吃掉

#关闭所有输出

[[email protected] shell]$ ls test.sh test1.sh  1>&- 2>&-

#关闭 1 ,2 文件描述符

[[email protected] shell]$ ls test.sh test1.sh  2>/dev/null 1>/dev/null

#将1,2 输出转发给/dev/null设备

[[email protected] shell]$ ls test.sh test1.sh >/dev/null 2>&1

#将错误输出2 绑定给 正确输出 1,然后将 正确输出 发送给 /dev/null设备  这种常用

<p>[[email protected] shell]$ ls test.sh test1.sh &>/dev/null

#& 代表标准输出 ,错误输出 将所有标准输出与错误输出 输入到/dev/null文件

</p>

注意:

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

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

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

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

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

  • 输入重定向

格式:

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

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

实例:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

[[email protected] shell]# cat > catfile

testing

cat file test

#这里按下 [ctrl]+d 离开

#从标准输入【键盘】获得数据,然后输出给catfile文件

[[email protected] shell]$ cat>catfile <test.sh

#cat 从test.sh 获得输入数据,然后输出给文件catfile

[[email protected] shell]$ cat>catfile <<eof

test a file

test!

eof

#<< 这个连续两个小符号, 他代表的是『结束的输入字符』的意思。这样当空行输入eof字符,输入自动结束,不用ctrl+D

  • exec绑定重定向

格式:

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

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

实例:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

[[email protected] shell]$ exec 6>&1

#将标准输出与fd 6绑定

[[email protected] shell]$ ls  /proc/self/fd/

0  1  2  3  6

#出现文件描述符6

[[email protected] shell]$ exec 1>suc.txt

#将接下来所有命令标准输出,绑定到suc.txt文件(输出到该文件)

[[email protected] shell]$ ls -al

#执行命令,发现什么都不返回了,因为标准输出已经输出到suc.txt文件了

[[email protected] shell]$ exec 1>&6

#恢复标准输出

[[email protected] shell]$ exec 6>&-

#关闭fd 6描述符

[[email protected] ~]$ ls /proc/self/fd/

0  1  2  3

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

有趣事情:

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

  • 复杂一点实例

1

2

3

4

5

6

7

8

9

10

11

exec 3<>test.sh;

#打开test.sh可读写操作,与文件描述符3绑定

while read line<&3

 do

    echo $line;

done

#循环读取文件描述符3(读取的是test.sh内容)

exec 3>&-

exec 3<&-

#关闭文件的,输入,输出绑定

时间: 2024-10-27 13:33:10

linux shell数据重定向的相关文章

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

本文为转载 原文链接 http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html 在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作. 用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit –n 定义数字有关系,不能超过最大值. linux启动后,会

实验理解Linux SHELL 输入输出重定向

在shell脚本中发现>/dev/null 2>&1这样的语句,以前没有去深入地理解这个命令的作用,这个命令和 2>&1 >/dev/null有什么区别?通过实验理解这两个命令及shell输入输出重定向的重点. shell重定向介绍 我们一般在使用shell命令的时候,多是通过键盘输入,在屏幕上查看命令的执行结果(包括正常输出与错误输出).如果某些情况下,我们需要将shell命令的执行结果存储到文件中,那么我们就需要使用输入输出的重定向. 文件描述符 当执行shel

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

linux shell 管道命令(pipe)使用及与shell重定向区别 看了前面一节:linux shell数据重定向(输入重定向与输出重定向)详细分析 估计还有一些朋友是头晕晕的,好复杂的重定向了.这次我们看下管道命令了.shell管道,可以说用法就简单多了. 管道命令操作符是:"|",它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 stdandard error 信息没有直接处理能力.然后,传递给下一个命令,作为标准的输入 st

Linux中的数据重定向

重定向即指:将数据传送输出到别的地方,如设备.文件等等.那就涉及到将什么数据传送到什么地方的问题. 在linux中命令执行的起源和结果说起,看下图: Standard input和Standard error都会输出到屏幕上,这样会将屏幕搞的非常混乱,且又是输出内容过多也不易于阅读.甚至有时候的输出内容非常重要需要保存,这是该怎么办?? 答案是:数据重定向,将输出内容导入到别的地方. linux中数据重定向的特殊符号: 标准输入:代码为0,使用<或者<< 标准输出:代码为1,使用1>

Linux shell管道与重定向及实例分析

一.管道 管道命令操作符是:"|",它仅能处理由前面一个命令的正确输出信息,也就是standard output的信息,对于stdandard error信息没有直接处理能力:然后,传递给下一个命令,作为标准输入standard input. linux管道执行过程: 管道命令使用说明: command1正确输出,作为command2的输入,然后command2的输出作为command3的输入,command3的输出打印到屏幕上: 通过管道:command1.command2的正确输出

Linux Shell脚本编写——呈现数据(五)

Linux系统将每个对象当做文件来处理.这包括输入和输出的过程.Linux用文件描述符来标识每个文件对象.文件描述符是一个非负整数,可以唯一地标识会话中打开的文件.每个过程一次最多可以有9个文件描述符.出于特殊目的,bash shell保留了最早的3个文件描述符(0.1和2) Linux的标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 SRDERR 标准错误 STDIN STDIN文件描述代表shell的标准输入.对于终端界面来说,标准输入就是键

Linux shell MMPF0100 i2c 获取数据

#!/system/bin/busybox ash # # Linux shell MMPF0100 i2c 获取数据 # 说明: # 本文主要记录通过shell脚本来获取MMPF0100的数据,更多的是为了更为 # 方便的获取到数据,在进行一些调试的时候能够更有效. # # 2016-4-1 深圳 南山平山村 曾剑锋 # # 检查参数个数 if [ $# -lt 3 ]; then echo "USAGE:" echo " i2cData.sh <curPage>

linux shell 脚本实现tcp/upd协议通讯(重定向应用)

linux shell 脚本实现tcp/upd协议通讯(重定向应用) http://www.cnblogs.com/chengmo/archive/2010/10/22/1858302.html

Linux Shell系列教程之(十六) Shell输入输出重定向

本文是Linux Shell系列教程的第(十六)篇,更多Linux Shell教程请看:Linux Shell系列教程 Shell中的输出和输入的重定向是在使用中经常用到的一个功能,非常实用,今天就为大家介绍下Shell输入输出重定向的相关知识. 一.Shell输入输出重定向概述 在了解重定向相关知识之前,我们先来看看Linux的文件描述符. Linux的文件描述符可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作. 用