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

[113718]Взгляните на это сообщество Ubuntu под заголовком: [114196]AptGet/Howto[114197], а именно на этот раздел, [114198]Настройка apt-получает возможность использовать http-прокси[114199].

Обычно вы устанавливаете эту переменную окружения так:

Вы можете получить значение для вашего прокси из браузера, если вы его еще не знаете, так как он, по-видимому, там работает. Этого должно быть достаточно, чтобы начать, в этих ссылках есть более подробная информация, если она вам нужна.[113723]

1
25.03.2015, 19:57
3 ответа

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

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

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

4
27.01.2020, 23:15

, если ваш test.bash выглядит следующим образом:

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

этот цикл сценария . 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% ошибок).

2
27.01.2020, 23:15

Если все ваши входные строки начинаются с 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 
0
27.01.2020, 23:15

Теги

Похожие вопросы