的手册页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
以“默认格式”格式化其输出,每个文件名由换行符分隔。