2016-02-24 4 views

ответ

2

От Баш ссылки о redirections:

Каждый Перенаправление который может предшествовать номер дескриптора файла, вместо этого может предшествовать слово вида {varname} , В этом случае для каждого оператора перенаправления, кроме >&- и <&-, оболочка будет выделять файловый дескриптор более 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, так что вы не увидите его на stdout).

После этого вам действительно не нужно закрывать дескриптор файла, он будет автоматически закрыт в конце скрипта (или сеанса); но если вы действительно хотите, так или иначе, чтобы закрыть его:

exec {logout}>&- 

Вы можете проверить дескрипторы файлов, которые открываются с

ls /dev/fd