zoukankan      html  css  js  c++  java
  • linux bash关闭标准输出1(exec 1<&-)后重新打开

    linux bash shell的再次学习。

    文件描述符:

    stdin,stdout 和 stderr 的文件描述符分别是 0,1 和 2(一个文件描述符说白了就是文件系统为了跟踪这个打开的文件而分配给它的一个数字)

    1 .避免管道产生的子shell

     #!/bin/bash
     
     E_WRONG_ARGS=71
     if [ -z "$1" ]
     then
         echo "Usage: $0 input-file"
         exit $E_WRONG_ARGS
     fi
     
     Lines=0
     
     cat "$1" | while read line; # 管道会产生子 shell
     do {
         echo $line
         (( Lines++ )); #  增加这个变量的值
         # 但是外部循环却不能访问
     }
     done
     
     echo "Number of lines read = $Lines" # 0
     # 错误!
     echo "------------------------"
     exec 3<> "$1"
     while read line <&3
     do {
         echo "$line"
         (( Lines++ )); #  增加这个变量的值
         # 现在外部循环就可以访问了
         #  没有子shell, 现在就没问题了
     }
     done
     exec 3>&-
     echo "Number of lines read = $Lines"
     exit 0
                                                                                 
    

      

    2.绑定屏幕的便准输出到 out这个文件,即将所有的标准输出都输出到out这个文件当中。

    --------------------------------------------------

    参考:https://www.cnblogs.com/sparkdev/p/10247187.html

    这样子来读入文件fly的内容

     清空文件

    ----------------------------------------------------------------------------

    Reopen STDOUT and STDERR after closing them?

    I am running this on an Ubuntu machine, so I am not sure if it'll work for you, but this is what I did:

    $ exec 1>&0
    $ exec 2>&0

    Suddenly, I had STDOUT and STDERR reconnected. Magic!

    Explanation: Running the following commands, we get the following output:

    $ ls -l /dev/stdout
    lrwxrwxrwx 1 root root 15 Jun 11 23:39 /dev/stdout -> /proc/self/fd/1
    
    $ ls -l /proc/self/fd/1
    lrwx------ 1 jay jay 64 Jun 22 01:34 /proc/self/fd/1 -> /dev/pts/10
    
    $ ls -l /proc/self/fd/
    total 0
    lrwx------ 1 jay jay 64 Jun 22 01:35 0 -> /dev/pts/10
    lrwx------ 1 jay jay 64 Jun 22 01:35 1 -> /dev/pts/10
    lrwx------ 1 jay jay 64 Jun 22 01:35 2 -> /dev/pts/10
    lr-x------ 1 jay jay 64 Jun 22 01:35 3 -> /proc/12224/fd

    Since all three fd's point to the same thing, we can return them back to normal just by pointing to /dev/pts/10 which the exec 1>&0 and exec 2>&0 do

  • 相关阅读:
    ASP.NET请求管道、应用程序生命周期、整体运行机制
    PHP面试总结
    ASP.NET MVC源码分析系列
    SQL中的重要语句
    Nicescroll滚动条插件的用法
    Nunit2.5.10快速上手(笔记)
    ucore 源码剖析
    《ucore lab8》实验报告
    《ucore lab7》实验报告
    《ucore lab6》实验报告
  • 原文地址:https://www.cnblogs.com/oxspirt/p/10249562.html
Copyright © 2011-2022 走看看