• Linux文件内容重定向


    文件描述符

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

    执行原理

      linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error output 2。以后每次用新的进程打开文件,都会绑定文件描述符,因为子进程都会继承父进程的详细信息,如:环境变量。对于任何一条Linux命令执行,都会是这样一个过程:
    1、首先有一个标准输入:Command.
    2、然后根据这个标准输入会有一个输出结果:标准输出与标准错误。
    3、如果成功了会将正确的内容输出到屏幕。
    4、如果错误了也会将错误的内容输出到屏幕,并且进行提示。
    5、这些默认的输出,输入都是linux系统内定的,我们在使用过程中,有时候并不希望执行结果输出到屏幕。我想输出到文件或其它设备。这个时候我们就需要进行输出重定向了。如下图:
    描述符原理

    常用操作符

    1、    标准输入(stdin):代码为0,使用<或者<< ;/dev/stdin -> /proc/self/fd/0
    2、    标准输出(stdout):代码为1,使用>或者>>; /dev/stdout -> /proc/self/fd/1
    3、    标准错误(stderr)代码为2,使用2>或者2>>;/dev/stderr -> /proc/self/fd/2

    输出重定向

    格式如下:

    command-line1 [1-n]> file或文件操作符或设备
    上面命令意思是:将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)  重定向其它输出设备(文件,打开文件操作符,或打印机等等)1,2分别是标准输出,标准错误。

    示例如下:

    实例一:显示当前目录文件 test.sh test1.sh,test1.sh实际不存在
    [root@asus-a53s data]# touch test.sh
    [root@asus-a53s data]# ls test.sh test1.sh
    ls: 无法访问test1.sh: 没有那个文件或目录
    test.sh
    
    实例二:正确输出与错误输出都显示在屏幕了,现在需要把正确输出写入suc.txt。
    [root@asus-a53s data]# ls test.sh test1.sh > suc.test    #标准输出代表的文件描述符可以省略
    ls: 无法访问test1.sh: 没有那个文件或目录
    [root@asus-a53s data]# cat suc.test 
    test.sh
    
    实例三:把错误输出,不输出到屏幕,输出到err.txt
    [root@asus-a53s data]# ls test.sh test1.sh > suc.test 2> err.txt
    [root@asus-a53s data]# cat suc.test err.txt 
    test.sh
    ls: 无法访问test1.sh: 没有那个文件或目录
    
    实例四:继续追加把输出追加到suc.txt、err.txt 
    [root@asus-a53s data]# ls test.sh test1.sh >> suc.test 2>> err.txt
    [root@asus-a53s data]# cat suc.test err.txt 
    test.sh
    test.sh
    ls: 无法访问test1.sh: 没有那个文件或目录
    ls: 无法访问test1.sh: 没有那个文件或目录
    
    实例五:将错误输出信息关闭掉
    [root@asus-a53s data]# ls test.sh test1.sh 2>&-    #&-代表关闭与它绑定的描述符,不输出。
    test.sh
    [root@asus-a53s data]# ls test.sh test1.sh 2> /dev/null         #/dev/null是linux下面的一个及时删除回收站
    test.sh
    
    实例六:关闭所有输出
    [root@asus-a53s data]# ls test.sh test1.sh 1>&- 2>&-             #直接关闭两个输出
    [root@asus-a53s data]# ls test.sh test1.sh > /dev/null 2>&1        #将正确与错误的输出都重定向到指定设备
    [root@asus-a53s data]# ls test.sh test1.sh &> /dev/null            #同上,&> 等于2>&1

    输入重定向

    格式如下:

    command-line [n]<file或文件描述符&设备
    将命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入。执行这个命令,将标准输入0,与文件或设备绑定。将由它进行输入。

    示例如下:

    实例一:用catfile文件里面的内容代替键盘输出,输出到屏幕。
    [root@asus-a53s data]# cp suc.test catfile
    [root@asus-a53s data]# cat < catfile 
    Ls                                    #这里如果内容过多,按下 [ctrl]+d 离开
    [root@asus-a53s data]# cat suc.test 
    ls
    
    实例二:从标准输入【键盘】获得数据,然后输出给catfile文件
    [root@asus-a53s data]# cat > catfile << EOF        #EOF可以是任何字符,代表结束
    > hello,This is my test!
    > EOF
    [root@asus-a53s data]# cat catfile             #上面用的是重定向覆盖,所以ls内容不见了
    hello,This is my test!
    
    实例三:从test.sh 获得输入数据,然后输出给文件catfile
    [root@asus-a53s data]# cat test.sh 
    1
    test1
    test1
    test1
    [root@asus-a53s data]# cat > catfile < test.sh     #这里在输入的时候不能用<<,因为<<同时是也代表结束输出
    [root@asus-a53s data]# cat catfile 
    1
    test1
    test1
    test1

    绑定重定向

    格式如下:

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

    示例如下:

    实例一:学习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/
    1  2  3

    参考地址:https://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html

  • 相关阅读:
    php 获取文件信息相关基础函数
    php常用基础数组函数
    php数组指针相关函数
    php 常用基础数学函数
    php 基本的常用字符串函数
    php 函数返回问题
    iframe 插入内容 (转)
    [OFFICE]如何查看OFFICE是否是永久激活
    [C语言]变量的声明和定义有什么区别
    [算法]快速判断一个数是否是2的幂次方
  • 原文地址:https://www.cnblogs.com/guge-94/p/10907569.html
Copyright © 2020-2023  润新知