Сохраните stdout и stderr в файле, затем заново создайте вывод позже

Я перенаправил вывод в файл следующим образом:

$ ./test.bash 2> >(sed 's/^/stderr: /' >> output) > >(sed 's/^/stdout: /' >> output) $ cat output stdout: Hello World! stderr: error 

Я хотел бы точно воспроизвести вывод исходной команды ./test.bash . Вот что я пробовал:

 $ cat output | tee >(grep '^stdout: '|sed 's/^stdout: //') >(grep '^stderr: '|sed 's/^stderr: //' 1>&2) >/dev/null 2>&1 | cat error Hello World! 

Очевидно, я хотел бы, чтобы результат был в правильном порядке. Каков наилучший способ сделать это?

3 Solutions collect form web for “Сохраните stdout и stderr в файле, затем заново создайте вывод позже”

Вероятно, в зависимости от вашего текущего файла:

 awk ' /^stdout:/ { print substr($0, 9) } /^stderr:/ { print substr($0, 9) > "/dev/stderr" } ' output 

Это может стать немного более элегантным с некоторыми изменениями в вашем «сценарии записи».

если ваш test.bash выглядит так:

 echo "Hello World!"; echo error >&2 

этот скрипт loop.sh :

 ./test.bash &> original ; echo original: ; cat original; ok=0 ; er=0 for i in {1..100}; do rm output ; printf "(ok%d:er%d) running again: " $ok $er ./test.bash 2> >(cat >>output) > >(cat >>output) #<-EXAMINED COMMAND if diff output original >/dev/null; then printf "result equal...."; ((ok++)) else printf "result DIFFERENT"; ((er++)); fi done 

должен доказать, что выходной файл часто ошибочно заказывается (~ 37% в моем тесте)

Проблема связана с параллельными процессами, неконтролируемой буферизацией перенаправления и скоростью выполнения.

Решение с помощью инструмента «unbuffer» из пакета «ожидать» (если вы можете его установить). С помощью:

 (sleep 0.01 ; unbuffer ./test.bash) 

вместо того, чтобы просто ./test.bash в 4-й строке вышеприведенного скрипта, сделают идеальный (0% ошибок).

Если все ваши строки ввода начинаются с stderr: или stdout: вы можете сделать:

 perl -ne 's/^std(...):\s*//; $1 eq "err" ? print STDERR : print' output 

Или, с последними версиями bash

 while read -r out line; do [[ $out =~ ^stderr ]] && echo "$line" >&2 || echo "$line" done < output 
  • путают скорость записи dd и кеш страниц VFS
  • Не удается установить EncFS
  • Как восстановить контейнер LVM для большего физического раздела?
  • «Найдено дублирующее PV»
  • Multipath для логического тома в промежуточной виртуальной машине
  • Программный RAID 1 с разной производительностью и производительностью
  • Рекомендация для пула накопителей usb
  • Почему LVM и RAID не требуют кластерной файловой системы
  • Разрешение отклонено при попытке доступа к установленным окнам NFS
  • Удаление диска из RAID
  • Какова наилучшая практика добавления дисков в LVM
  • Interesting Posts

    Узнайте, запущен ли компьютер через Wake-on-LAN или кнопку питания?

    Получить полный каталог $ file

    Как запустить скрипт, как только изменится номер недели?

    Принуждение системы позволить мне вставить любой символ в имя файла

    Как запустить последующие оболочки с правами root?

    создать машину в реальном времени, назначив ядра ЦП критически важным процессам

    Каков правильный синтаксис sudoers для добавления пользователя?

    Физические тома, логические тома, суперблоки исчезли … как загрузиться?

    Очистить историю bash, за исключением последних n строк

    Сохраняет ли общедоступный и закрытый ключ для пользователя или системы?

    fluxbox клавиатура switch немецкий, греческий (современный) и политонический греческий

    Понять два примера, используя косвенное расширение для переменного расширения в арифметических выражениях

    Как узнать, какие учетные записи, связанные с ssh, запущены

    Освещение объекта функции AWK-скрипта

    Вырезать поле один за другим в сценарии оболочки

    Linux и Unix - лучшая ОС в мире.