For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/proposal-hashbang.md.
  • 简体中文
  • Hashbang Grammar S4

    中文标题:Hashbang 语法

    提案概览
    提案速览

    该提案通过在 JS 引擎中处理 hashbang(#!)注释的剥离,而不再由 CLI 宿主处理,从而标准化了源文件开头的 hashbang 语法。它仅在 Script 或 Module 目标的开头允许 hashbang,支持 eval 但不支持 Function,并处理了 BOM 的交互。

    Note

    以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。

    Hashbang 语法

    本提案旨在匹配某些 CLI JS 宿主中的事实用法,这些宿主允许使用 Shebangs / Hashbang。这些宿主目前会剥离 hashbang,以生成有效的 JS 源文本,然后再传递给 JS 引擎。该提案将剥离操作移至引擎,从而统一并标准化这一过程。

    示例

    #!/usr/bin/env node
    // 在 Script 目标中
    'use strict';
    console.log(1);
    #!/usr/bin/env node
    // 在 Module 目标中
    export {};
    console.log(1);

    状态

    为什么使用 Hashbang 而不是 Shebang

    Hash 通常与现代涉及 # 的术语相关联,如 hashtag。此外,为了便于发现,"hash sign" 用于表示 #,而 "she sign" 则不常用。

    为什么只在源文本开头允许

    对于各种 CLI 环境中的解释器,Hashbang 注释仅在文件开头有效。在其他位置允许它并不会带来预期用途上的好处,实际上可能导致混淆,因为 CLI 环境不会识别。此外,在其他位置允许 Hashbang 会与 #! 作为某种中缀二元运算符的语法空间重叠。如果需要在其他位置添加行注释,请使用 //

    hashbang 语法是否适用于 eval / Function

    Hashbang 注释仅在 ScriptModule 解析目标的开头可用。由于 eval 使用 Script,它确实支持 Hashbang 注释。由于 Function 使用 FunctionBody,它不支持。

    与字节顺序标记的交互

    源文本开头的 字节顺序标记(BOM)字符会阻止后续的 #! 被解释为 hashbang。但是,Web 浏览器在获取外部 脚本模块 时会剥离此字符(分别在 decodeUTF-8 decode 中),这发生在文本被解释为 ECMAScript 之前。因此,在浏览器中,外部脚本或模块(而非内联脚本)中 #! 之前可以存在 BOM 字符。

    一般来说,BOM 字符假定由宿主处理,本提案不给予特殊对待。

    会议现有记录