ls 输出将名为“N'*”的文件显示为“N'\''*”

ls 输出将名为“N'*”的文件显示为“N'\''*”

系统:

  • Ubuntu 22.04.3 LTS
  • GNU bash,版本 5.1.16(1)-release (x86_64-pc-linux-gnu)
  • ls(GNU coreutils)8.32

情况:

$ touch "N'*"
$ ls
'N'\''*'

GNU Coreutils - 引用文件名“ 状态:

“带有单引号的文件以一种荒谬的方式打印!”这个问题在 8.26 版本中很快得到了修复:

$ touch "Don't README.txt"

$ ls-8.25 

'Don'\''t README.txt'   ## version 8.25


$ ls 

"Don't README.txt"      ## version 8.26 and later
(bug22696#19)

问题:有人能够解释上面的示例和我的文件之间处理单引号的差异吗?

答案1

我对此进行了一些测试,ls当文件名包含单引号时,它看起来像是回退到单独的单引号方法除空格之外的其他特殊字符。例如:

$ cat fileNames
one space
one'quote
quote'and*
quote'and?

$ while IFS= read -r file; do touch "$file"; done < fileNames 

$ ls
 fileNames  "one'quote"  'one space'  'quote'\''and*'  'quote'\''and?'

我猜开发人员只是认为在双引号时捕获所有可能的失败名称太复杂了,因此他们恢复到对于复杂情况更难阅读但更容易编写的单引号。

请注意,该示例确实有效(至少在我的系统上):

$ touch "Don't README.txt"
$ ls
"Don't README.txt"

您需要另一个特殊字符才能获得其他引用样式:

$ touch "Don't README.*" "Don't README.txt"
$ ls
'Don'\''t README.*'  "Don't README.txt"

相关内容