为什么 ls 将某些文件名用单引号括起来?

Has*_*ziz 17 linux unix ls coreutils

我注意到,当我ls在终端中进行操作时,有些文件名用单引号括起来,有些则不是。

我不喜欢这种外观,因为我更喜欢我的终端输出美观且统一。是什么导致此功能,是否可以安全地禁用它?

在此处输入图片说明

Has*_*ziz 20

为什么ls将某些文件名用单引号括起来

ls 用单引号将文件名括起来,其中包含空格,目的是允许安全地复制文件名、在脚本中使用或通过另一个命令进行管道传输。

在此处输入图片说明

这是最近在 2016 年被引入到GNU包8.25 版的一个非常不受欢迎的功能,只有三个开发人员的共识。coreutils

对此变化的批评者引用的论点包括它使输出ls看起来更加难看,与近半个世纪的 Unix 传统不必要地背道而驰,并且由于它的实现方式(选择退出而不是选择加入)破坏了兼容性使用长期存在的脚本和实用程序。

因为这个特性被引入到coreutils包中——几乎每个 Linux 发行版都依赖于它,并且它ls是其中的一部分——这一变化影响了每个 Linux 或可以想象的类 Linux 系统,从 Arch Linux 到 Cygwin。

在 Debian 和 Debian 衍生发行版(如 Ubuntu)的情况下,经过大量抗议后,更改在某个时候恢复,然后在 2017 年 10 月再次恢复

正如这个答案所表明的那样,表达您对此更改感到失望的最佳方法是coreutils通过错误报告直接联系开发人员,并(礼貌地)提出他们犯了一个巨大错误的论点。根据开源精神,一大批用户恭敬而坚决地坚持认为ls过去的行为方式应该正确恢复,理论上应该足以说服coreutils开发人员听取 Linux 社区的意见。


恢复8.25ls之前版本的行为

从更短期的、务实的意义上讲,有几种方法可以恢复ls' 8.25 版之前的所有输出保持不变的行为。以下是针对bashshell执行此操作的三种方法。

使用QUOTING_STYLE环境变量

~/.bashrc在 HOME 文件夹 ( /home/yourusername) 中找到您的文件,并向其中添加以下行:

export QUOTING_STYLE=literal
Run Code Online (Sandbox Code Playgroud)

保存文件,更改应立即应用于bash您打开的所有新终端。

您还可以运行source ~/.bashrc以将更改推送到进行更改时打开的任何终端窗口。

创建别名 ls -N

如果您更喜欢使用别名而不是环境变量,您还可以创建一个.bashrc使用 8.25 新-N开关的别名。来自ls --help

-N , --literal打印条目名称而不引用

为此,请将以下行添加到您的~/.bashrc文件中并保存:

alias ls="ls -N"
Run Code Online (Sandbox Code Playgroud)

运行source ~/.bashrc以将新更改推送到所有打开的终端。

仅对于当前运行:使用-N命令行开关

如果你更喜欢coreutils' 新的默认行为但想暂时绕过它,你也可以-N直接在命令中使用开关:

ls -N
Run Code Online (Sandbox Code Playgroud)