Unbuffer глотает статус выхода убитого процесса

627
frankc

Ожидается, что команда «unbuffer» проглатывает состояние выхода своего дочернего элемента, если процесс завершен. Есть ли что-то, что можно сделать, чтобы остановить это поведение? Он не глотает состояние выхода, если дочерний процесс завершается с ненулевым состоянием выхода в целом.

Чтобы убедиться в этом, рассмотрим 2 сценария bash:

a.sh:  exit 1 

против

b.sh: kill -11 $$ 

затем создайте буфер для каждого из них и напечатайте $ ?. В первом случае я вижу 1, а во втором - 0, когда ожидаю 139

1

1 ответ на вопрос

3
user210584

Да, вы должны изменить сценарий «unbuffer», чтобы изменить способ «unbuffer» ждать завершения дочернего процесса.

Из ожидаемой документации:

Дополнительные элементы могут появиться в конце возвращаемого значения из ожидания. Необязательный пятый элемент идентифицирует класс информации. В настоящее время единственным возможным значением для этого элемента является CHILDKILLED, в этом случае следующие два значения - это имя сигнала в стиле C и краткое текстовое описание.

В сценарии «unbuffer» найдите exit [lindex [wait] 3]и замените его следующим кодом:

set result [wait] send_user "wait returned: $result\n" if { [llength $result] == 4 } { exit [lindex $result 3] } else { exit 1 } 

После этой модификации вы четко увидите разницу. Например, запустив ваш b.shскрипт, вы получите что-то вроде этого:

wait returned: 8606 exp6 0 0 CHILDKILLED SIGSEGV

Конечно, вы можете изменить значение exit 1на любое значение, которое вы пожелаете. Вы можете выйти с помощью 139, если хотите, но значение не изменится в соответствии с сигналом, если вы не добавите еще больше кода в сценарий «unbuffer».

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