Я не міг змусити роботу дуже простого однолінійного лайнера Денніса, тож ось метод, який є набагато більш суворим. Я спробував би його першим.
Як згадувалося, ви можете використовувати exec для переадресації стандартної помилки та стандарту для всього сценарію. Так:
exec > $LOGFILE 2>&1
Це виводить всі stderr та stdout до $ LOGFILE.
Тепер, оскільки ви хочете, щоб це відображалося на консолі, а також в лог-файлі, вам також доведеться використовувати іменовану трубку для exec для запису, а tee для читання з.
(Однолінійний вкладиш Денніса технічно це також робить, хоча очевидно по-іншому) Сама труба створена mkfifo $PIPEFILE. Потім виконайте наступне.
# Почніть писати трійку в лог-файл, але витягніть його з назви.
tee $ LOGFILE <$ PIPEFILE &
# захоплення ідентифікатора процесу трійника для команди очікування.
TEEPID = $!
# переспрямовуємо решту stderr та stdout до нашої названої труби.
exec> $ PIPEFILE 2> & 1
ехо "Зробіть свої команди тут"
відлуння "Усі їхні стандартні норми дістануться".
echo "Так буде їх стандартна помилка"> & 2
# закрити дескриптори файлів stderr та stdout.
exec 1> & - 2> & -
# Зачекайте, коли трійник закінчиться з тих пір, коли інший кінець труби закрився.
зачекайте $ TEEPID
Якщо ви хочете бути ретельними, ви можете створити та знищити названий файл-файл на початку та в кінці сценарію.
Для запису я зібрав більшу частину цього з дуже інформативної публікації в блозі випадкового хлопця: ( Архівна версія )