了解bash exec {logout}?

时间:2016-02-24 09:16:02

标签: bash

以下Bash命令有何功能?

exec {logout}> >(tee -a "${LOGFILE}")

exec {logout}>> "${LOGFILE}"

1 个答案:

答案 0 :(得分:2)

来自关于redirections的Bash参考:

  

可以在文件描述符号之前的每个重定向可以改为在{varname}形式的单词之后。在这种情况下,对于除>&-<&-之外的每个重定向运算符,shell将分配大于10的文件描述符并将其分配给{varname}

  • 案件

    exec {logout}> >(tee -a "${LOGFILE}")
    

    Bash将打开一个新的文件描述符,将相应的整数分配给变量logout,并将此文件描述符链接到进程替换

    tee -a "${LOGFILE}"
    

    输入此命令后,您可以检查变量logout是否已分配给整数。然后,每次将流重定向到文件描述符$logout时,它都会被送到tee

    #!/bin/bash
    
    logfile=testlogfile
    
    exec {logout}> >(tee -a "$logfile")
    echo "logout=$logout"
    
    # now output some stuff to fd $logout:
    echo >&"$logout" "Hello file descriptor $logout"
    
    # it will send the message to tee, so that you'll see it on stdout
    # and will also be appended to $logfile
    
    # Check that output really got to $logfile:
    cat "$logfile"
    
  • 第二种情况类似,但这一次,转到文件描述符$logout的输出只会附加到$logfile(并且不会传递给tee,所以你赢了&#39;在stdout看到它。

在此之后,您真的不需要关闭文件描述符,它将在脚本(或会话)结束时自动关闭;但如果你真的想要关闭它:

exec {logout}>&-

您可以检查使用

打开的文件描述符
ls /dev/fd