Поскольку перенаправление обрабатывается до выполнения соответствующей команды, в случае сбоя перенаправления команда вообще не будет выполняться.
Итак, для
./script.sh >"$output"
, чтобы успешно запустить сценарий, даже если перенаправление к файлу в $output
не удалось, нам сначала нужно определить, можно ли выполнить перенаправление вручную.
Это можно проверить, перенаправив вывод, например, из. echo
и поймать, не сработало оно или нет:
if ! echo >"$output" 2>/dev/null; then
output=/dev/null
fi
./script.sh >"$output"
Здесь мы перенаправляем вывод на /dev/null
, если выходной файл по умолчанию непригоден для использования. Вместо этого вы можете использовать, например. /dev/stdout
вместо /dev/null
, если вы вместо того, чтобы отбрасывать вывод, хотите, чтобы он перешел к стандартному выводу.
Я бы рекомендовал использовать уже существующую подсистему протоколирования(syslog
). Инструмент строки команды -для доступа к этому — logger
.
Установите средство user
с соответствующим приоритетом вывода (ошибок, предупреждений, информации, отладки и т. д. )и тегом метки, представляющей вашу программу, и все готово:
your_program 2>&1 | logger -t your_program -p user.info
Вы можете использовать tee
в качестве посредника вместо прямого перенаправления вывода команды. Он не остановится только из-за сбоя при открытии выходного файла.
$ cat out.sh
#!/bin/bash
outfile=${1-/dev/null}
echo hello | tee "$outfile"
echo done.
$ touch unwritable; chmod a-w unwritable
$ bash out.sh unwritable
tee: unwritable: Permission denied
hello
done.
Статус выхода конвейера будет статусом выхода последней команды, tee
. Если вам нужен статус выхода первой части конвейера, вы можете использовать, например. массив Bash PIPESTATUS
, чтобы получить его.
Перенаправьте вывод tee
на /dev/null
, если вы не хотите копировать вывод на стандартный вывод сценария.