1

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

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

a.sh:

    exit 1

против

b.sh:
    kill -11 $$

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

1 ответ1

3

Да, вы должны изменить сценарий "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 {segmentation violation}

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .