• 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

  • 相关阅读:
    VUE组件间传参
    JS-03 (RegExp对象&字符串总结)
    JS-02 (字符串的正则函数)
    理解 C++ 的 Memory Order
    GCC的原子操作函数
    barrier内存屏障
    tcp重传机制,流量控制,拥塞控制
    TCP 的拥塞控制
    Monitoring and Tuning the Linux Networking Stack: Receiving Data
    kernel网络之软中断
  • 原文地址:https://www.cnblogs.com/oxspirt/p/10249562.html
Copyright © 2020-2023  润新知