为什么“ ls”突然用单引号引起来用空格包装项目?


187

我只是注意到,在我的其中一台机器上(运行Debian Sid),只要键入ls任何带空格的文件名,都将单引号引起来。

我立即检查了别名,却发现它们完整无缺。

wyatt@debian630:~/testdir$ ls
'test 1.txt'  test1.txt
wyatt@debian630:~/testdir$ alias
alias ls='ls --color=auto'
alias wget='wget --content-disposition'
wyatt@debian630:~/testdir$

(图片)

另一个测试,文件名称中包含单引号(也回答jimmij的请求):

wyatt@debian630:~/testdir$ ls
'test 1.txt'  test1.txt  'thishasasinglequotehere'\''.txt'
wyatt@debian630:~/testdir$ touch "'test 1.txt'"
wyatt@debian630:~/testdir$ ls
''\''test 1.txt'\'''  test1.txt
'test 1.txt'          'thishasasinglequotehere'\''.txt'

(图片)

使用新的coreutils-8.26输出进行更新(虽然它的混乱程度要小得多,但是默认情况下仍然很烦人)。感谢PádraigBrady的此打印输出:

$ ls
"'test 1.txt'"   test1.txt
'test 1.txt'    "thishasasinglequotehere'.txt"

$ ls -N
'test 1.txt'  test1.txt
test 1.txt    thishasasinglequotehere'.txt

为什么会这样呢?如何正确停止?

为了澄清,我本人将ls设置为自动彩色输出。它从来没有把引号括起来。

我正在运行bashcoreutils 8.25。

编辑:似乎coreutils开发人员认为(链接)是一个好主意,尽管打破了最少惊讶的原则以及UNIX已有46年以上的历史,但仍使其成为全球默认值。

有什么办法解决这个问题而无需重新编译?


更新-2017年10月-Debian Sid默认情况下重新启用了外壳转义引用。这太荒谬了。https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877582

在上一个错误报告的回复链的底部,“更改是有意的,并将保留。” https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=813164#226

我以为这已经解决了。显然不是。

更新:2019年4月:刚刚在PHP中找到了一个奇怪的错误报告,该错误报告是由对的更改引起的ls。当您使开发人员感到困惑并生成错误的错误报告时,是时候重新考虑您的更改了。

更新:Android toybox ls现在正在执行类似的操作,但是使用反斜杠代替引号。使用-q选项可使空格呈现为“问号字符”(由于它们显然不是空格,因此我没有检查它们是什么),因此到目前为止,我发现的唯一解决方法是不添加有问题的设备启动脚本时将其提供给脚本并提供源代码。ls如果在终端中,此功能将使用列,否则将每行打印一次,同时ls逐字逐字地进入打印空间,因为它是通过管道运行的。

ls() {
    # only way I can stop ls from escaping with backslashes
    if [ -t 1 ]; then
        /system/bin/ls -C "$@" |cat
    else
        /system/bin/ls "$@" |cat
    fi
}

20
为什么不解析ls命令的另一个原因。
jimmij

12
它看起来很奇怪,但是如果仅在打印到终端时才启用它,那是有道理的。您可以清楚地看到您拥有文件“ test 1.txt”,而不是文件“ test”和另一个“ 1.txt”。尝试ls | cat看看它是否消失。如果我有一台时间机器,我会回到1970年的贝尔实验室,并试图说服Ken Thompson,在文件名和目录名中留出空间是一个坏主意。:-P
Bjorn Munch

6
当我第一次看到此消息时,我吓了一跳,以为我的一个脚本出错了,并将所有文件重命名为'*'。我想我会四处添加ls别名到我的所有机器上摆脱它...
有限赎罪

14
正如Lekensteyn指出的那样,@LimitedAtonement可以使用环境变量QUOTING_STYLE=literal而不是别名来实现。(我想这是一个口味问题,但我更喜欢使用变量。)
LSpice

4
@BjornMunch有两种解决方法来判断是一个文件还是两个文件:1)寻找如何绘制列,这很明显。2)每行列出一项。与单引号的修饰相比,两者看起来都更好和更清晰。
Wyatt8740 '16

Answers:


132

前言:虽然赞成这样一个答案并每天称呼它可能会很令人满意,但是请放心,GNU开发人员并不关心SO答案票,并且,如果您实际上想鼓励他们改变答案,需要通过此答案向他们发送电子邮件


为什么会这样?

几位coreutils开发人员决定,他们比几十年来的事实标准要了解得多。


我如何正确停止它?

http://www.gnu.org/software/coreutils/coreutils.html

错误报告

如果您认为您在Coreutils中发现了错误,请尽可能完整地将错误报告发送到<bug-coreutils@gnu.org>,它将自动输入到Coreutils错误跟踪器中。在报告错误之前,请阅读常见问题解答。关于如何编写错误报告和提出良好问题的非常有用且经常被引用的指南是文档“如何以明智的方式提出问题”。您可以浏览以前的帖子并搜索bug-coreutils档案。

还原  此更改的发行版:

发行版不受影响:

  • openSUSE(已使用-N)

“有什么方法可以解决这个问题而无需重新编译?

支持者会让你...

通过在其ls别名中添加-N来恢复旧格式

…在永恒的余下时间里,无论您身在何处,所有装置上都可以使用。


17
更改是在邮件列表中提出的,并得到三位coreutils维护者的同意,是一项净收益。我们完全对此持开放态度。毕竟,这是开源的,我们并不是要命令,而只是要改善事情。请随时在list.gnu.org/archive/html/coreutils/2016-02/msg00000.html的coreutils线程中做出回应(顺便说一句,有人提出了建设性的建议,以改善此处提到的美学缺陷之一,通过添加一个空间,来改善对准)
帕德莱格贝迪

31
@PádraigBrady更新了答案。但是,您在coreutils线程中看到了拒绝负载。最重要的是,您正在为人们创造更多的工作,并且您是以OS的名义进行工作的,该OS是1970年的OS的克隆版本。如果人们希望有所不同,他们会选择加入。
Jan Kyu Peblik

43
@PádraigBrady此更改使我感到烦恼,并浪费了数小时试图找到原因和解决方案。我并不是说要消极-我只是在分享别人的观点!改变核心行为具有重大意义
。.– mafrosis

52
作为使用* nix系统30年的人,我发现像这样的无谓更改非常令人讨厌。他们一方面破坏了长期存在的脚本。他们还违反了最小惊讶原则。如上所述,“选择加入”应该是此处的默认设置。
布赖恩·克拉珀

28
@PádraigBrady仍然不是推动此类更改的方法。选择启用行为而不是默认启用是一种更具建设性的方式。它还错误地暗示了这是文件名的存储方式,总之,ls您所看到的不再是文件名的存储方式。该功能应该是可选的,而不是默认功能。

91

您可以选择引用样式

ls --quoting-style=literal

与:

ls -N

要么:

QUOTING_STYLE=literal ls

使它成为一个别名,或设置export QUOTING_STYLE=literal.bashrc实现前8.25行为。


11
为了正常的unix-y行为,我必须这样做有点奇怪。另外,我想要旧的默认设置。我不认为转义是旧的默认值-我认为它确实打印了实际的内容。
Wyatt8740 '16

9
对于8.25之前的行为,请export QUOTING_STYLE=literal在您的bashrc中使用。
Lekensteyn '16

2
或使用-N,似乎。由于我已经建立了个人存储库,因此我只是在编译自己的版本。
Wyatt8740 '16

2
我已经编辑了@LSpice literal而不是使用该帖子escape(我相信@cuonglm只是想展示如何更改样式,而不是专门针对escape样式)。
Lekensteyn '16

5
这个答案值得更多的赞扬。它直接解决了发问者要求避免官僚作答的问题。确实,环境变量方法看起来非常优雅。(我个人更喜欢新的行为,因为它倾向于更有效的C&P动作),但是ls足够聪明,可以在使用重定向时表现出旧的方式,因此对使用ls输出的脚本无害。
Marcelo

42

有关更改的几点。

  • 它在coreutils v8.25中引入,并且在v8.26中改进了对齐方式
  • 它仅在输出到终端时发生,因此不会破坏脚本
  • 它为包含空格的文件的用户消除了歧义
  • 它可以清理输出,因此可以安全地复制和粘贴
  • 现在,输出始终有效,可以复制并粘贴回shell
  • 用户可以通过在其ls别名中添加-N来恢复原来的格式

7
我的最后一个例子不是模棱两可吗?也许不是-但它确实令人迷惑,需要更多时间来解密。我认为这是一个可怕的变化(无意冒犯您)。虽然感谢别名提示。
Wyatt8740 '16

27
注意:此更改是在coreutils 8.25中引入的(commit,由与本文相同的Pádraig编写)。我个人认为这种行为不是最佳的,只要文件名中出现空格,它就会破坏对齐方式。
Lekensteyn '16

10
我的道歉-显然,您至少在安全地用shell引用了shell引用。我仍然不喜欢它。选项很好-但是以降低其准确性的方式改变具有数十年历史的Unix核心实用程序的非常明确的默认行为,只是一个主意。
mikeserv '16

12
@PádraigBrady所以,你要保持ls崩溃吗?查看所有反对您更改的论点。没有人想要。也许是时候向世界道歉并撤消它了。
克里斯·沃里克

6
@PádraigBrady因此,尽管有很多人解释了这是错误的,损坏的等等,但是您仍然不会还原它,从而使默认值保持不变?与您的信念相反,此更改不会混淆歧义。建议人们设置环境变量或别名充其量是充其量。
Mark
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.