Mam skrypt, który wywołuje program (w szczególności ttf2afm
część tetex 3.0), który czasami segfuje, a czasem nie. Informacje, których potrzebuję, są zawsze drukowane, zanim ulegną segregacji, ale trudno mi jest powstrzymać przekierowanie potoku przed awarią i nie wysyłać niczego do potoku, gdy program zawiedzie.
Próbowałem przekierować przez FIFO, nawiasować proces za pomocą true
znaku na końcu, wykonywać z funkcji powłoki i otaczać sh -c
, ale skrypt nigdy nie wydaje, aby proces wypuścił cokolwiek , przekierował lub w inny sposób - nawet do stderr.
Wiem, że jest w stanie generować dane wyjściowe, ponieważ jest doskonale zdolny do podania go z wiersza poleceń, ale z jakiegoś powodu nie ze skryptu.
Moje pytanie brzmi: czy jest jakikolwiek sposób, aby skrypt zignorował fakt, że program się nie zgadza i daje mi wynik?
Używam wersji BASH 4.1.10 (2).
źródło
W końcu doszedłem do tego przez proces prób i błędów. Rozwiązanie jest dość skomplikowane:
Najwyraźniej
exec
przyczynyttf2afm
przejmują proces podpowłoki z błędem uwięzionym, powodując, że działa on w środowisku, w którym nie ma znaczenia, czy ulegnie awarii.Wychwytywanie
ERR
sygnału obejmującego wszystko zatrzyma śmierć powłoki wewnętrznej i wyśle sygnał do skryptu głównego - który natychmiast się zakończy, jeśli to zrobi - gdy program zawiedzie.Jedynym problemem jest to, że samo jądro wyśle całą wiązkę śmieci śledzenia stosu bezpośrednio na urządzenie konsoli, gdy proces ulegnie segregacji, więc nie ma sposobu, aby zapobiec wyświetlaniu go [o czym wiem], ale to nie ma znaczenia ponieważ nie wpływa to na stdout ani stderr.
źródło
ttf2afm
. Zastanawiam się, jak(trap true ERR; exec ttf2afm "$FONT")| …
udaje się zachowywać inaczej niżttf2afm "$FONT" | …
.