为什么程序输出的文件tree
包含奇怪的字符?例如:
$ tree -fFN --charset=utf8 -o list.txt test/
文件内容list.txt
:
<0x1b>[01;34mtest<0x1b>[00m
├── <0x1b>[01;34mtest/folder-01<0x1b>[00m/
│ ├── test/folder-01/file-01
│ └── test/folder-01/file-02
├── <0x1b>[01;34mtest/folder-02<0x1b>[00m/
│ ├── test/folder-02/file-03
│ └── <0x1b>[01;34mtest/folder-02/folder-04<0x1b>[00m/
│ └── test/folder-02/folder-04/file-05
└── <0x1b>[01;34mtest/folder-03<0x1b>[00m/
└── test/folder-03/file-04
这些是什么角色?
<0x1b>
[01;34m
[00m
我在 macOS Mojave 上使用终端应用程序。直到几天前,没有这些额外的字符,输出都是正确的。
答案1
我高度怀疑你发布的“文件内容list.txt
”是解释(表示)实际内容,而不是文字内容。这样才有意义。
<0x1b>
您用来查看文件的程序打印的内容代表(不可打印)ASCII 转义字符(在不同情况下,该字符可能被称为ESC
、、、、)。\x1b
\033
\e
^[
然后<0x1b>[01;34m
和类似的序列CSI 序列。您的文件包含 SCI 序列,这些序列会改变以下文本的颜色。运行cat list.txt
以将文件原样传递到终端。如果您的终端支持 CSI 序列(可能支持),那么您将看到彩色文本。
序列存在于文件中,因为您tree
将它们放在那里。在我的 Kubuntu 中,man 1 tree
有几个选项可以对输出进行着色(或不着色):-C
,-n
。如果没有这些选项,行为取决于环境LS_COLORS
变量TREE_COLORS
以及 stdout 是否为终端。
默认情况下,如果设置了LS_COLORS
(或),将对其输出到终端进行着色,但如果通过管道传输到非终端(例如文件或管道中的下一个命令),则不会着色。奇怪的是,如果你告诉它写入文件,那么它的行为TREE_COLORS
tree
-o
仍然取决于stdout 是否是终端。如果你重定向标准输出到非终端
tree -fFN --charset=utf8 -o list.txt test/ >/dev/null
# or simply
tree -fFN --charset=utf8 test/ >list.txt
那么输出将不包含颜色代码。
直到几天前,没有这些额外的字符,输出才是正确的。
LS_COLORS
也许直到几天前,您的环境中还没有颜色代码;并且之前创建的文件不包含颜色代码。您LS_COLORS
最近是否向环境中添加了颜色代码?或者也许之前的文件中包含颜色代码,但您过去常常以实际使用 CSI 序列来显示颜色的方式检查它们?或者忽略它们?
首先,不清楚您是否希望颜色代码出现在文件中。
无论如何,请检查你的手册tree
。使用适当的选项强制着色或不着色,或操纵环境和/或重定向以使其tree
行为符合你的预期。
如果您需要从已经存在的文件中删除颜色代码,则请将每个文件通过此帖子中的一个过滤器:从文本流中删除 ANSI 颜色代码。
答案2
我添加了 -n 选项,问题就解决了。我已将 LS_COLOR 添加到 .bash_profile 文件中。