查看您创建的文件。它看起来像这样(在vi 中查看时):
LS(1) BSD General Commands Manual LS(1)
N^HNA^HAM^HME^HE
l^Hls^Hs -- list directory contents
S^HSY^HYN^HNO^HOP^HPS^HSI^HIS^HS
l^Hls^Hs [-^H-A^HAB^HBC^HCF^HFG^HGH^HHL^HLO^HOP^HPR^HRS^HST^HTU^HUW^HW@^H@a^Hab^Hbc^Hcd^Hde^Hef^Hfg^Hgh^Hhi^Hik^Hkl^Hlm^Hmn^Hno^Hop^Hpq^Hqr^Hrs^Hst^Htu^Huw^Hwx^Hx1^H1] [_^Hf_^Hi_^Hl_^He _^H._^H._^H.]
D^HDE^HES^HSC^HCR^HRI^HIP^HPT^HTI^HIO^HON^HN
For each operand that names a _^Hf_^Hi_^Hl_^He of a type other than directory, l^Hls^Hs
displays its name as well as any requested, associated information. For
each operand that names a _^Hf_^Hi_^Hl_^He of type directory, l^Hls^Hs displays the names
of files contained within that directory, as well as any requested, asso-
ciated information.
看到^H了吗?这意味着备份一个空间。 man 命令产生troff 输出,然后将该输出通过管道传送到nroff 本身以格式化该输出以供显示。 Troff 是一个文本格式化程序,用于格式化打印的页面。因此,要给单词加粗,troff 会在一个字母上退格并在上面输入。这样做的次数越多,字母就越黑。
当您在终端上使用man 或nroff 时,它会理解B^HB 表示加粗的B,并将以终端突出显示的颜色显示该字母。 less 命令做同样的事情。
另一方面,您的cat 命令实际上是按原样显示文件。当它看到序列B^HB 时,它会在您的屏幕上显示一个B,备份一个空格,并在前一个B 之上显示另一个B。由于这是一个终端而不是打印机,第二个B 显示在与前一个B 相同的像素之上。
试试这个(因为您使用的是 Mac):
CLICOLOR_FORCE=1
ls > ls.txt
cat ls.txt
请注意,这确实会显示颜色。设置CLICOLOR_FORCE 环境变量会强制ls 显示彩色输出即使它没有显示在终端上。如果您查看VI 中的ls.txt,您会看到类似[34m 和^[[m^[[m 的序列。这告诉 ANSI 终端设置各种颜色,cat 将显示这些颜色(除非您使用 -v 选项)。
换句话说,您的假设是倒退的。 Cat 为您提供了文件的完美再现版本,而 less 命令正在处理输出以将 letter-backspace-letter 序列显示为粗体。