程序通常会缓冲其输出以提高效率。也就是说,它们将输出累积在一个存储区(称为缓冲区)中,并且只有在缓冲区已满或程序中的某些关键点时,它们才实际输出输出。程序正常结束时,它将刷新输出缓冲区(即打印出其中剩余的任何数据)。当它出现段错误时,缓冲区的内容将丢失。
当直接在终端中运行程序时,您不会观察到这种效果,因为当程序的输出连接到终端(与常规文件或管道相对)时,行为是不同的。在终端中,默认行为是在每一行的末尾刷新缓冲区。因此,您将看到程序段出现故障时所产生的所有完整行。
您可以强制程序在终端中运行并收集其输出。最简单的方法是运行script
。您需要解决许多烦恼:
script
在脚本文件中添加标题行,之后您需要将其删除。
script
不会返回命令的状态码,因此,如果您想了解segfault或任何其他错误,则需要将其保存在某处。
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