stdin/stderr 重定向、管道和颜色

stdin/stderr 重定向、管道和颜色

我在这个问题上看到了无数的排列,但我认为没有一个是完全重复的。

我可以仅将 stderr (或最终 stderr 和 stdin)复制到文件,同时保留彩色的屏幕上的输出(如果文件也被着色,那就更好了)

答案1

每个命令都可以有一个特殊命令来始终发送颜色转义代码,如其他答案中所示。但更通用的方法是使用以下工具。

解缓冲

unbuffer ls -l --color=auto | tee output.log

unbuffer是来自的命令预计包裹。

参考号超级用户 - 在管道到 T 恤时保留颜色

脚本

script --flush --quiet --command "ls -l --color=auto" | tee output.log

script是来自的命令实用程序Linux包裹。

参考号StackOverflow - 可以通过 shell 重定向捕获彩色输出吗? [复制]

答案2

管道或重定向不会删除任何颜色!


当您使用的初始命令注意到输出不是终端时,它会删除颜色!因此不能作为该问题的一般答案。

参见例如man ls

ls仅当标准输出连接到终端时才发出颜色代码。

您可以使用 来更改行为--color=always

同样适用于grep

   --color[=WHEN], --colour[=WHEN]
          Surround  the  matched (non-empty) strings, matching lines, context lines, file names, line numbers, byte offsets, and separators (for fields
          and groups of context lines) with escape sequences to display them in color on the terminal.  The  colors  are  defined  by  the  environment
          variable  GREP_COLORS.   The  deprecated environment variable GREP_COLOR is still supported, but its setting does not have priority.  WHEN is
          never, always, or auto.

例如:

echo 123 | grep --color=always 2 | tee file

...将为2终端和文件中的输出提供颜色。

在输出中包含颜色,但是不是在文件中,您可以检查以下问题的答案这个问题然后运行例如:

echo 123 | grep --color=always 2 | tee /dev/tty | ansi2txt > file

相关内容