Eu tenho um script que chama um programa (especificamente ttf2afm
, parte do tetex 3.0) que às vezes segfaults e às vezes não. As informações de que eu preciso são sempre impressas antes de serem segmentadas, mas estou tendo dificuldades para impedir que o redirecionamento do canal falhe e não produza nada para o canal quando o programa falha.
Tentei redirecionar por meio de um FIFO, parênteses o processo com a true
no final, executando a partir de uma função shell e inserindo-o sh -c
, mas o script nunca parece permitir que o processo produza algo , redirecionado ou não - nem mesmo para o stderr.
Eu sei que é capaz de produzir, sendo perfeitamente capaz de fornecê-lo a partir da linha de comando, mas não de um script por algum motivo.
Minha pergunta é: existe alguma maneira de o script ignorar o fato de que o programa se segfaults e me fornecer a saída de qualquer maneira?
Estou executando o lançamento do BASH 4.1.10 (2).
fonte
Finalmente descobri isso através de um processo de tentativa e erro. A solução é meio complicada:
Aparentemente, as
exec
causasttf2afm
assumem o processo do subshell com o erro interceptado, fazendo com que ele opere em um ambiente em que não importa se ele é falhado.Interceptar o
ERR
sinal com tudo incluído impedirá que o subshell morra e envie um sinal para o script principal - que terminará imediatamente se o fizer - quando o programa falhar.O único problema é que o próprio kernel produzirá um monte de lixo de rastreamento de pilha diretamente no dispositivo do console, uma vez que o processo segfaults, portanto não há como impedir que ele seja produzido [que eu saiba], mas isso não importa pois não afeta stdout ou stderr.
fonte
ttf2afm
diretamente. Eu me pergunto como(trap true ERR; exec ttf2afm "$FONT")| …
consegue se comportar de maneira diferentettf2afm "$FONT" | …
.