Несоответствие порядка между stdout и stderr в bash - PullRequest
0 голосов
/ 10 февраля 2019

Я выполняю команду bash в интерактивной оболочке как ./somescript.sh

Это дает вывод как

OS platform is: linux2
killall agent
agent: no process killed

, где третья строка идет от stderr.

Но когдаЯ выполняю в подоболочке как

var=$('./somescript.sh' 2>&1)
agent: no process killed
OS platform is: linux2
killall agent

Почему агент: не убитый процесс печатает в первой строке сейчас?Как я могу сделать это согласованным, чтобы выровнять их обоих?

Редактировать: Однако, когда я это сделал, var=$('./somescript.sh' 1>&2) я вижу, что это дает вывод в правильном порядке в режиме отладки bash.Но это не хранится в переменной var.

1 Ответ

0 голосов
/ 10 февраля 2019

Почему агент: не убитый процесс печатает в первой строке сейчас?

Я полагаю, потому что stdout буферизуется, а stderr нет (или не так много)).Таким образом, stderr get сбрасывается после потоковой передачи строки agent: no process killed, а stdout - после существования сценария ./somescript.sh.Таким образом, первым, кто появляется на экране, является первый очищенный поток, т.е.STDERR.Во время работы в консоли stderr и stdout оба настроены как буферизованные строки, подстановка команды int Я предполагаю, что stdout набора bash полностью буферизован.

Вы можете попробовать установить буферизацию строки в подстановке команд.var=$(stdbuf -oL -eL ./somescript.sh 2>&1)

...