У меня есть скрипт, который вызывает программу (в частности, ttf2afm
часть tetex 3.0), которая иногда вызывает ошибки, а иногда нет. Информация, которая мне нужна, всегда выводится на печать до того , как она выйдет из строя , но мне трудно остановить сбой перенаправления канала и не выводить что-либо в канал при сбое программы.
Я попытался перенаправить через FIFO, заключив в скобки процесс с true
конечным символом, выполнив из функции оболочки и заключив в него sh -c
, но, похоже, что скрипт никогда не позволяет процессу выводить что-либо , перенаправленное или иным образом - даже в stderr.
Я знаю, что он способен выводить данные, поскольку он вполне способен выдавать его из командной строки, но не по какой-либо причине из сценария.
У меня вопрос, есть ли способ для сценария игнорировать тот факт, что программа segfaults и дать мне результат в любом случае?
Я использую BASH 4.1.10 (2) -релиз.
источник
Я наконец понял это через процесс проб и ошибок. Решение немного запутанное:
По-видимому,
exec
причиныttf2afm
захвата процесса subshell с перехваченной ошибкой заставляют его работать в среде, где не имеет значения, происходит ли сбой.Перехват
ERR
сигнала «все включено» предотвратит гибель подоболочки и передачу сигнала основному сценарию, который немедленно прекратит работу, если произойдет сбой программы.Единственная проблема состоит в том, что само ядро будет выводить целую кучу мусора трассировки стека непосредственно на консольное устройство после того, как процесс завершит работу с ошибками, поэтому нет способа предотвратить его вывод [это я знаю], но это не имеет значения поскольку это не влияет на стандартный вывод или стандартный вывод.
источник
ttf2afm
напрямую. Интересно, как(trap true ERR; exec ttf2afm "$FONT")| …
удается вести себя иначе, чемttf2afm "$FONT" | …
.