/bin/ls 的排序方式与 ls 不同

Jos*_* M. 20 linux unix bash command-line

$ ls |sort
xyz-0.0.1-1554490900.rpm
xyz-0.0.1-1554745305.rpm
xyz-0.0.1-1554751021.rpm
xyz-0.0.1-1555513460.rpm
xyz-0.0.1-1555951745.rpm
xyz-0.0.1-1554323568.rpm

$ /bin/ls |sort
xyz-0.0.1-1554323568.rpm
xyz-0.0.1-1554490900.rpm
xyz-0.0.1-1554745305.rpm
xyz-0.0.1-1554751021.rpm
xyz-0.0.1-1555513460.rpm
xyz-0.0.1-1555951745.rpm

$ which ls
alias ls='/bin/ls --color'
        /bin/ls
Run Code Online (Sandbox Code Playgroud)

请注意,这两个命令之间的排序不同(ls |sort导致排序不正确)。这一定是由于颜色标志,但为什么呢?

Fre*_*ddy 25

在排序后的彩色输出中ls|sort,我们可以看到最后一行xyz-0.0.1-1554323568.rpm是非彩色输出的第一行。其他行同样排序。

如果我们查看彩色转义码(未排序),我们可以看到第一行以不同的转义码开头^[[0m。这会在排序时导致错误的顺序(^[[01before ^[[0m)。

$ /bin/ls --color xyz* | cat -A
^[[0m^[[01;31mxyz-0.0.1-1554323568.rpm^[[0m$
^[[01;31mxyz-0.0.1-1554490900.rpm^[[0m$
^[[01;31mxyz-0.0.1-1554745305.rpm^[[0m$
^[[01;31mxyz-0.0.1-1554751021.rpm^[[0m$
^[[01;31mxyz-0.0.1-1555513460.rpm^[[0m$
^[[01;31mxyz-0.0.1-1555951745.rpm^[[0m$
Run Code Online (Sandbox Code Playgroud)


小智 24

做:

/bin/ls --color > file1
/bin/ls > file2
Run Code Online (Sandbox Code Playgroud)

并比较内容,您会看到不同之处。

混叠ls/bin/ls --color=auto可能是更好的主意,它会停止ls使用颜色代码时没有直接写入终端(管道到下一个程序时或写入文件等)。

  • @乔什M。好吧,如果可能的话,排序应该由 `ls` 自己完成。使用`sort` 排序是*解析*,[一般不推荐](https://mywiki.wooledge.org/ParsingLs)。 (16认同)
  • 是的,@Freddy,非常真实。但是,使用 `alias ls='/bin/ls --color'` 只是一个麻烦的方法。 (10认同)
  • @JoshM.,而不是使用 `/bin/ls`,将你的别名更改为 Tomak 建议的,你将自动获得更好的行为。 (6认同)
  • @乔什M。你也可以使用 `\ls` 表示无别名的 `ls` 或 `command ls` 表示 `/bin/ls`。 (5认同)