‘tree’ 生成的文件中有奇怪的字符

‘tree’ 生成的文件中有奇怪的字符

为什么程序输出的文件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_COLORStree-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 文件中。

相关内容