Unbuffer schluckt den Exit-Status des getöteten Prozesses

1

Der Expect "Unbuffer" -Befehl scheint den Exit-Status seines Kindes zu verschlucken, wenn der Prozess beendet wird. Gibt es etwas, das getan werden kann, um dieses Verhalten zu stoppen? Der Beendigungsstatus wird nicht verschluckt, wenn der untergeordnete Prozess im Allgemeinen mit einem Beendigungsstatus ungleich Null beendet wird.

Betrachten Sie zwei Bash-Skripte, um dieses Verhalten zu beobachten:

a.sh:

    exit 1

vs

b.sh:
    kill -11 $$

Entpuffern Sie dann jeden von ihnen und drucken Sie $ ?. Im ersten Fall sehe ich 1, im zweiten Fall sehe ich 0, wenn ich 139 erwarte

frankc
quelle

Antworten:

3

Ja, Sie müssen das Skript "Unbuffer" ändern, um die Art und Weise zu ändern, in der "Unbuffer" auf die Beendigung des untergeordneten Prozesses wartet.

Aus erwarten Dokumentation:

Zusätzliche Elemente können am Ende des Rückgabewerts von wait erscheinen. Ein optionales fünftes Element kennzeichnet eine Informationsklasse. Derzeit ist CHILDKILLED der einzig mögliche Wert für dieses Element. In diesem Fall sind die nächsten beiden Werte der C-Signalname und eine kurze Textbeschreibung.

Suchen Sie im Skript "Unbuffer" nach exit [lindex [wait] 3] und ersetzen Sie es durch den folgenden Code:

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

Nach dieser Änderung werden Sie den Unterschied deutlich sehen. Zum Beispiel läuft Ihr b.sh Skript erhalten Sie so etwas:

wait returned: 8606 exp6 0 0 CHILDKILLED SIGSEGV {segmentation violation}

Sie können natürlich den Wert von ändern exit 1 von jedem Wert, den Sie wünschen. Sie können mit beenden 139, wenn Sie möchten, aber der Wert ändert sich nicht, um mit dem Signal übereinzustimmen, es sei denn, Sie fügen dem Skript "Unbuffer" noch mehr Code hinzu.

user210584
quelle