Os programas normalmente armazenam em buffer sua saída para eficiência. Ou seja, eles acumulam saída em uma área de memória (chamada de buffer) e, na verdade, obtêm a saída somente quando o buffer está cheio ou em determinados pontos-chave do programa. Quando o programa termina normalmente, ele libera o buffer de saída (isto é, imprime todos os dados que restam nele). Quando ocorre o segfault, o conteúdo do buffer é perdido.
Você não observa este efeito ao executar o programa diretamente em um terminal porque o comportamento é diferente quando a saída do programa é conectada a um terminal (em oposição a um arquivo regular ou a um pipe). Em um terminal, o comportamento padrão é liberar o buffer no final de cada linha. Portanto, você verá todas as linhas completas produzidas até o ponto em que os segfaults do programa.
Você pode forçar o programa a ser executado em um terminal e coletar sua saída. A maneira mais simples é executar script
. Há vários inconvenientes que você precisa resolver:
-
script
adiciona uma linha de cabeçalho ao arquivo de transcrição, que você precisará remover depois.
-
script
não retorna o código de status do comando, então você precisa salvá-lo em algum lugar se quiser saber sobre o segfault ou qualquer outro erro.
-
script
causará saída normal e erro; é melhor salvar a saída do erro em um arquivo separado.
export FONT="foo"
script -q -c '
ttf2afm "$FONT.ttf" 2>"$FONT.ttf2afm-err";
echo $? >"$FONT.ttf2afm-status"
' "$FONT.ttf2afm-typescript"
tail -n +2 <"$FONT.ttf2afm-typescript" >"foo.afm"
rm "$FONT.ttf2afm-typescript"
if [ "$(cat "$FONT.ttf2afm-status")" -ne 0 ]; then
echo 1>&2 "Warning: ttf2afm failed"
cat "$FONT.ttf2afm-err"
fi