Обычно вы устанавливаете эту переменную окружения так:
Вы можете получить значение для вашего прокси из браузера, если вы его еще не знаете, так как он, по-видимому, там работает. Этого должно быть достаточно, чтобы начать, в этих ссылках есть более подробная информация, если она вам нужна.[113723]
В зависимости от вашего текущего файла, вероятно, это будет делать:
awk '
/^stdout:/ { print substr($0, 9) }
/^stderr:/ { print substr($0, 9) > "/dev/stderr" }
' output
Это может получить немного более элегантно с некоторыми изменениями в вашем «скрипте записи».
, если ваш 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% ошибок).
Если все ваши входные строки начинаются с 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