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

我立即检查了别名,却发现它们完整无缺。 br />
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设置为自动彩色输出。

我正在运行bash和coreutils 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玩具箱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
}


评论

为什么不解析ls命令的另一个原因。
它看起来很奇怪,但是如果仅在打印到终端时才启用它,那是有道理的。您可以清楚地看到您有一个文件“ test 1.txt”,而不是文件“ test”和另一个“ 1.txt”。试试ls |猫,看看它是否消失。如果我有一台时间机器,我会回到1970年的贝尔实验室,并试图说服肯·汤普森(Ken Thompson),在文件名和目录名中留出空间是个坏主意。 :-P

当我第一次看到此消息时,我感到非常震惊,以为我的一个脚本出错了,并将所有文件重命名为“ *”。我想我会四处添加ls别名来摆脱它...

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

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

#1 楼

前言:虽然赞成这样的答案并每天称呼它可能会很令人满意,但是请放心,GNU coreutils的维护者们并不在乎SO的答案,并且如果您实际上想鼓励他们改变,您可以需要通过电子邮件发送此答案所描述的内容。


更新2019:过去一年中,维护人员已经加倍努力,现在向任何bug-coreutils@gnu.org提供有关此问题的报告bug-coreutils@gnu.org报告不断施加的压力显然已经产生了作用,迫使人们产生了这种变化。这个庞大而荒谬的页面,并可能将愿意处理该问题的维护人员数量减少到一个。当这么多人认为某件事是一个错误时,无论维护人员是否不同意都是一个错误。继续向他们发送电子邮件仍然是最简单的道路鼓励变革。


“为什么会这样?”

几位coreutils维护者认为他们比几十年来的事实标准更了解。


“如何正确停止?”

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


错误报告

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


已经还原的发行版此更改:



Debian coreutils-8.25-2


因此,大概包括Ubuntu以及数百种基于Debian和基于Ubuntu的衍生版本



发行版不受影响:


> openSUSE(已使用-N)


“有什么方法可以在不重新编译的情况下解决此问题?”

支持者会让您...


通过在其ls别名中添加-N来返回旧格式。


…在您的所有安装中,到处都是永恒的。

评论


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

–Pádraig Brady
16 Feb 15'在20:46

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

– Jan Kyu Peblik
16-2-17在22:21

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

–乳房畸形
16年3月16日在16:15

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

–布莱恩·克拉珀(Brian Clapper)
16年4月7日,0:01

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

–user86969
16-5-26在13:19



#2 楼

您可以选择引用样式:

ls --quoting-style=literal


与以下内容相同:

ls -N


或:

QUOTING_STYLE=literal ls


为其添加别名,或在export QUOTING_STYLE=literal中设置.bashrc以实现8.25之前的行为。

评论


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

–Wyatt8740
16年1月30日在15:58

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

– Lekensteyn
16年1月31日,11:07

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

–Wyatt8740
16年1月31日15:12



@LSpice我已经编辑了帖子以使用文字而不是转义符(我相信@cuonglm只是想展示如何更改样式,而不是专门针对转义符样式)。

– Lekensteyn
16年2月16日在10:31

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

–马塞洛
17年11月24日在1:17



#3 楼

有关更改的几点注意事项。


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


评论


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

–Wyatt8740
16 Jan 30'15:58



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

– Lekensteyn
16年1月31日,11:01

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

–mikeserv
16-2-5在17:03



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

–克里斯·沃里克(Chris Warrick)
16年4月24日在18:39

@PádraigBrady因此,尽管有很多人解释了这是错误的,损坏的等等,但是您仍然不会还原它,从而使默认值保持不变?与您的信念相反,此更改不会混淆歧义。建议人们设置环境变量或别名充其量是充其量。

–马克
17年1月14日下午3:11