Подстановка команды / процесса POSIX
_log()( x=0
while [ -e "${TMPDIR:=/tmp}/$$.$((x+=1))" ]
do continue; done &&
mkfifo -- "$TMPDIR/$$.$x" &&
printf %s\\n "$TMPDIR/$$.$x" || exit
exec >&- >/dev/null
{ rm -- "$TMPDIR/$$.$x"
logger --priority user."$1" --tag "${0##*/}"
} <"$TMPDIR/$$.$x" &
) <&- </dev/null
Вы должны быть в состоянии использовать это как:
exec >"$(_log notice)" 2>"$(_log error)"
Вот версия, которая использует mktemp
команду:
_log()( p=
mkfifo "${p:=$(mktemp -u)}" &&
printf %s "$p" &&
exec <&- >&- <>/dev/null >&0 &&
{ rm "$p"
logger --priority user."$1" --tag "${0##*/}"
} <"$p" &
)
... который делает то же самое, за исключением того, что позволяет mktemp
выбрать имя файла для вас. Это работает, потому что процесс подстановки отнюдь не волшебен и работает очень похоже на подстановку команд . Вместо замены расширения значением команды, выполняемой в нем, как это делает подстановка команд, подстановка процесса заменяет его именем ссылки на файловую систему, в которой можно найти выходные данные.
В то время как оболочка POSIX не обеспечивает прямого следствия для такой вещи, эмулировать это очень просто. Все, что вам нужно сделать, это создать файл, вывести его имя из стандарта из подстановки команд и в фоновом режиме запустить вашу команду, которая будет выводить в этот файл. Теперь вы можете просто перенаправить на значение этого расширения - точно так же, как вы делаете с подстановкой процесса. И поэтому оболочка POSIX предоставляет все инструменты, которые вам, конечно, нужны - все, что вам нужно, - это использовать их так, как вам удобно.
Обе вышеупомянутые версии гарантируют, что они разрушают связь файловой системы с каналами, которые они создают / используют, прежде чем использовать их. Это означает, что не требуется никакой очистки после факта, и, что более важно, их потоки доступны только процессам, которые их первоначально открывают, и поэтому ссылки на их файловые системы не могут использоваться в качестве средства для отслеживания / захвата вашей деятельности по ведению журнала. Оставлять свои fs-ссылки в файловой системе - потенциальная дыра в безопасности.
Другой способ - обернуть его. Это можно сделать из скрипта.
x=${x##*[!0-9]*}
_log(){
logger --priority user."$1" --tag "${0##*/}"
} 2>/dev/null >&2
cd ../"$PPID.$x" 2>/dev/null &&
trap 'rm -rf -- "${TMPDIR:-/tmp}/$PPID.$x"' 0 ||
{ until cd -- "${TMPDIR:=/tmp}/$$.$x"
do mkdir -- "$TMPDIR/$$.$((x+=1))"
done &&
x=$x "$0" "$@" | _log notice
exit
} 2>&1 | _log error
Это, в основном, позволит вашему сценарию вызывать себя, если он еще этого не сделал, и даст вам рабочий каталог во временную загрузку.