ANSI 转义代码彩色内容在通过管道传输到“head”时被错误截断

ANSI escape code colored content truncated incorrectly when piped to `head`

给定以下文件:

RED = "\e[0;31m"
RESET = "\e[0m"

content = [
  "01 foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux",
  "02 foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux",
  "03 foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux",
  "04 foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux",
  "05 foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux",
].join("\n")

puts content.chars.map { |c| [RED, c, RESET].join }.join

当我 运行 然后将其通过管道传输到 head 时,输出得到 t运行 通过第 2 行的一部分。相同的代码使用 Ruby 工作正常。

示例:

$ crystal -v
Crystal 0.23.1 (2017-10-12) LLVM 4.0.1
$ crystal build test.cr && ./test | head -3
01 foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux
02
$ ruby test.cr | head -3
01 foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux
02 foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux
03 foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux foo bar baz qux

我怎样才能让它像 Ruby 版本一样运行?我不确定这是否是 Crystal 中的错误,或者我是否应该通过其他方式输出到 STDOUT。如有任何帮助,我们将不胜感激!

此问题已在 Crystal 0.25.0 及更高版本中修复,请参阅 https://github.com/crystal-lang/crystal/issues/2713 了解详细讨论。

我也运行 0.25.1 上的示例,它工作正常。