Во-первых, вы должны избегать echo
для вывода произвольных данных .
В системах, отличных от Linux, вы можете использовать:
logfile=/dev/stdout
Для Linux это работает для некоторых типов stdout, но не работает, когда stdout является сокетом или хуже, если stdout является обычным файлом, это могло бы обрезать этот файл вместо записи в текущую позицию stdout в файле.
Кроме этого, в оболочке типа Bourne нет возможности использовать условное перенаправление, хотя вы можете использовать eval
:
eval 'printf "%s\n" "$buf" '${logfile:+'> "$logfile"'}
вместо переменной , вы можете использовать специальный файловый дескриптор :
exec 3>&1
[ -z "$logfile" ] || exec 3> "$logfile"
printf '%s\n' "$buf" >&3
(небольшой) недостаток в том, что, за исключением ksh
, утечка fd 3 будет происходить для каждой команды, выполняемой в сценарий. С помощью zsh
вы можете выполнить sysopen -wu 3 -o cloexec - "$ logfile" || exit
вместо exec 3> "$ logfile"
, но bash
не имеет эквивалента.
Еще одна распространенная идиома - использовать такие функции, как:
log() {
if [ -n "$logfile" ]; then
printf '%s\n' "$@" >> "$logfile"
else
printf '%s\n' "$@"
fi
}
log "$buf"