プログラムは通常、効率のために出力をバッファリングします。つまり、メモリ領域(バッファと呼ばれる)に出力を蓄積し、実際にバッファがいっぱいになったとき、またはプログラムの特定のキーポイントでのみ出力を取得します。プログラムが正常に終了すると、出力バッファーがフラッシュされます(つまり、残っているデータが出力されます)。セグメンテーション違反が発生すると、バッファのコンテンツは失われます。
プログラムの出力がターミナルに接続されている場合(通常のファイルまたはパイプとは対照的に)の動作が異なるため、ターミナルでプログラムを直接実行する場合、この効果は見られません。端末では、デフォルトの動作は各行の終わりでバッファをフラッシュすることです。そのため、プログラムがセグメンテーション違反になる時点までに生成されたすべての完全な行が表示されます。
プログラムを強制的に端末で実行し、その出力を収集できます。最も簡単な方法は、実行することscript
です。回避する必要がある厄介な点がいくつかあります。
script
トランスクリプトファイルにヘッダー行を追加します。後で削除する必要があります。
script
はコマンドのステータスコードを返しません。そのため、セグメンテーション違反やその他のエラーについて知りたい場合は、どこかに保存する必要があります。
script
通常の出力とエラー出力が発生します。エラー出力を別のファイルに保存することをお勧めします。
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