Что делает следующая команда Bash?понимание bash exec {logout}?
exec {logout}> >(tee -a "${LOGFILE}")
или
exec {logout}>> "${LOGFILE}"
Что делает следующая команда Bash?понимание bash exec {logout}?
exec {logout}> >(tee -a "${LOGFILE}")
или
exec {logout}>> "${LOGFILE}"
От Баш ссылки о 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