假设我是一个精神病患者,我将我的文件命名为:
[-] `{title: "Non-Metadata", id: "s4a4ji"}`{.JSON5}.dir
这是我尽力做出最丑陋、最合理的文件名的尝试 —— 它使用 Pandoc Markdown 和 JSON5。
POSIX
如果我将其输入到 中ls
,它会为我提供一个转义版本,这样任何符合 POSIX 标准的 shell(当然是 sh,但bash
在 Fedora 40 中也是 )都可以毫无问题地解释它:
-
ls "$PWD"
-
' [-]'$'\t''`{title: "Non-Metadata",'$'\t''id: "s4a4ji"}`{.JSON5}.dir'
八位字节
但是,tree
似乎file
用一种八位字节转义表示形式替换非 ASCII 字符,而这种表示形式似乎无法以上述方式使用:
-
tree "$PWD"
-
. └── [-]\011`{title: "Non-Metadata",\011id: "s4a4ji"}`{.JSON5}.dir 2 directories, 0 files
UTF-8
当然,PowerShell CoreGet-ChildItem
只输出完整的 UTF-8 表示形式:
-
Get-ChildItem -LiteralPath "$PWD" | Select-Object -ExpandProperty 'Name'
-
[-] `{title: "Non-Metadata", id: "s4a4ji"}`{.JSON5}.dir
这些操作方式为何不同?我期望ls
、tree
和file
至少操作方式相同,因为据我所知,这些都是 GNU CoreUtils。此外,PowerShell 似乎表明,没有什么从根本上强制这些工具转义非 ASCII 字符,那么它们为什么要这样做呢?