为什么当通过 tr "\n" "\n"` 进行管道传输时,`ls` 的输出看起来不同?

为什么当通过 tr "\n" "\n"` 进行管道传输时,`ls` 的输出看起来不同?

的手册页tr(1)说:

       tr - translate or delete characters

SYNOPSIS
       tr [OPTION]... SET1 [SET2]

DESCRIPTION
       Translate, squeeze, and/or delete characters from standard input, writing to standard output.

据我所知,这意味着它需要“\n”,然后用“\n”替换它[这意味着没有任何改变]。

但这并不能解释为什么这样做ls | tr '\n' '\n'会产生以下效果:

 $ ls 
 Documents   Downloads   Git   Music   Pictures  '#recycle'   Videos
2019-Dec-24 07:28:44 PM modernNeo:modernNeo-debian/home/modernNeo
 $ ls | tr "\n" "\n"
Documents
Downloads
Git
Music
Pictures
#recycle
Videos

答案1

该实用程序的输出ls可能会有所不同,具体取决于输出是直接写入终端还是管道。

tr '\n' \n'如果您使用以下命令,您将获得相同的行为cat

$ ls
file-00 file-01 file-02 file-03 file-04 file-05 file-06 file-07 file-08 file-09
$ ls | cat
file-00
file-01
file-02
file-03
file-04
file-05
file-06
file-07
file-08
file-09

ls此行为每行列出一个文件,是以下描述的默认输出该实用程序的 POSIX 标准:

默认格式应为每行列出一个条目到标准输出;终端或指定-C-m或选项之一时除外。-x如果输出到终端,则格式是实现定义的。

您还会注意到,#recycle当通过管道过滤输出时,文件名周围的单引号“消失”。事实上,这些从来都不是文件名的一部分,而只是 GNUls在将名称输出到终端时决定呈现名称的方式(基于名称包含的字符;被#认为是“特殊”)。当输出到达终端时,单引号名称和列中的输出是标准允许的“实现定义的格式”。

通过重定向到文件(或支持这些的 shell 中的进程替换)来替换管道也会ls以“默认格式”格式化其输出,每个文件名由换行符分隔。

相关内容