AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1848192
Accepted
RokeJulianLockhart
RokeJulianLockhart
Asked: 2024-07-06 00:46:25 +0800 CST2024-07-06 00:46:25 +0800 CST 2024-07-06 00:46:25 +0800 CST

为什么核心 CLI 实用程序的输出中 UTF-8 路径(不同)被转义?

  • 772

假设我是一个精神病患者,我将我的文件命名为:

  [-]   `{title: "Non-Metadata",    id: "s4a4ji"}`{.JSON5}.dir

这是我尽力做出最丑陋、最合理的文件名的尝试 —— 它使用 Pandoc Markdown 和 JSON5。

POSIX

如果我将其输入到 中ls,它会为我提供一个转义版本,这样任何符合 POSIX 标准的 shell(当然是 sh,但bash在 Fedora 40 中也是 )都可以毫无问题地解释它:

  1. ls "$PWD"
    
  2. '  [-]'$'\t''`{title: "Non-Metadata",'$'\t''id: "s4a4ji"}`{.JSON5}.dir'
    
八位字节

但是,tree似乎file用一种八位字节转义表示形式替换非 ASCII 字符,而这种表示形式似乎无法以上述方式使用:

  1. tree "$PWD"
    
  2. .
    └──   [-]\011`{title: "Non-Metadata",\011id: "s4a4ji"}`{.JSON5}.dir
    
    2 directories, 0 files
    
UTF-8

当然,PowerShell CoreGet-ChildItem只输出完整的 UTF-8 表示形式:

  1. Get-ChildItem -LiteralPath "$PWD" | Select-Object -ExpandProperty 'Name'
    
  2.   [-]   `{title: "Non-Metadata",        id: "s4a4ji"}`{.JSON5}.dir
    

这些操作方式为何不同?我期望ls、tree和file至少操作方式相同,因为据我所知,这些都是 GNU CoreUtils。此外,PowerShell 似乎表明,没有什么从根本上强制这些工具转义非 ASCII 字符,那么它们为什么要这样做呢?

powershell
  • 1 1 个回答
  • 15 Views

1 个回答

  • Voted
  1. Best Answer
    grawity_u1686
    2024-07-06T01:06:33+08:002024-07-06T01:06:33+08:00

    POSIX

    据我所知,在您的版本ls发布时这不是 POSIX 语法;它$'...'直到上周才成为 POSIX 2024 的一部分;在此之前它只是一个被广泛采用的 ksh 语法功能。

    然而,tree 和 file 似乎用一种八位字节转义表示来替换非 ASCII 字符

    这是八进制表示,使用模仿 C 字符串文字的语法。(它确实支持十六进制,但八进制在某种程度上是“传统的”。)我认为这是 libbsdstrvis()默认使用的样式。

    此外,这些不是“非 ASCII”字符:制表符是 ASCII 的重要组成部分,涵盖了从 0 到 127 的所有字节值。高于 127(0x7F、0177)的字节值将是非 ASCII。

    这些操作为何不同?

    它们是三个不同的程序,就这么简单。没有“输出文件名”的通用函数——每个程序在将其写入 stdout 之前都会应用它想要的任何转义。(这也是 GNU 和 BSD 风格不同的地方。)

    我希望 ls、tree 和 file 至少能够以相同的方式运行,因为据我所知,这些都是 GNU CoreUtils。

    不是。只有lsGNU coreutils 是 GNU 的 – 其他两个根本不属于 GNU 范畴。

    此外,PowerShell 似乎表明没有任何东西从根本上强制这些工具转义非 ASCII 字符,那么他们为什么要这样做呢?

    程序也可以在没有“从根本上被强迫”的情况下执行操作。例如,许多程序会故意转义至少 ASCII C0 控制字符,以便它们不会被终端(错误)解释。

    Coreutilsls一直选择--quoting-styles 是为了使“无效”字符更容易区分,并且(如果我没记错的话,从 9.0 版本开始)故意默认使用 Bash 样式的引用,以便可以将此类文件名直接复制/粘贴到 GNU shell 中。

    (另请参阅历史上的 Unixdsw工具,以及人们用来删除无法输入文件名的文件的各种其他技巧。)

    另一方面,PowerShell 甚至不认为字符串是文件名:它只是某个对象的字符串值属性。当整个对象( Get-ChildItem 的结果)被格式化为 stdout 时,它会应用一些转义,但各个属性并不知道它们的位置。

    tree只是做了基本的努力来防止 ASCII 控制字符对您的终端产生不良影响,但并没有真正针对可复制粘贴性。

    • 1

相关问题

  • 如何将变量字符串放入powershell中的数组?

  • Powershell 和正则表达式:Notepad++“保存时备份”文件列表。编辑名称,按上次写入时间排序

  • 将前景颜色添加到 Powershell 配置文件?

  • 禁用后无法启用 Microsoft Print to PDF

  • 我可以让这个 PowerShell 脚本接受逗号吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Vickel Firefox 不再允许粘贴到 WhatsApp 网页中? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve