`ls` 的输出重定向到文件时出现的奇怪字符

moa*_*eep 2 ls io-redirection special-characters escape-characters

我想在一个文本文件中列出当前工作目录的组件

ls -1 > textfile
Run Code Online (Sandbox Code Playgroud)

输出看起来不错,更多。

1010661085645
1010729039145
1010747080245
1010849051345
1010859053445
1011046075845
Run Code Online (Sandbox Code Playgroud)

但是当我用 emacs 查看这个文本文件时,出现了几个奇怪的字符

[0m[01;34m1010661085645[0m
[01;34m1010729039145[0m
[01;34m1010747080245[0m
[01;34m1010849051345[0m
[01;34m1010859053445[0m
[01;34m1011046075845[0m
Run Code Online (Sandbox Code Playgroud)

谁能解释这里发生了什么?

mic*_*has 7

那些“奇怪的字符”是用于为输出着色的转义序列。

这将以蓝色打印该数字:

echo -e '\033[01;34m1010729039145\033[0m'
Run Code Online (Sandbox Code Playgroud)

有关man console_codes更多详细信息,请参阅。


您可以判断ls在哪些情况下它应该输出颜色:

   --color[=WHEN]
          colorize the output; WHEN can be 'never', 'auto', or 'always' (the default); more info below
Run Code Online (Sandbox Code Playgroud)

看起来您ls实际上是ls --color=always. (键入type ls以进行验证。)

通常ls --color=auto会做正确的事情:它会在屏幕上打印颜色,但不会打印到文件中。


如果您真的想要文件中的颜色,则必须决定是要查看实际的转义序列还是已解释的颜色。

例如,该less命令将默认打印实际序列,但您可以使用以下-R选项告诉它显示颜色:

   -R or --RAW-CONTROL-CHARS
          Like -r, but only ANSI "color" escape sequences are output in "raw" form.
Run Code Online (Sandbox Code Playgroud)

尝试less textfilevs. less -R textfile.