惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Engineering at Meta
Engineering at Meta
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
博客园_首页
云风的 BLOG
云风的 BLOG
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hugging Face - Blog
Hugging Face - Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The GitHub Blog
The GitHub Blog
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 【当耐特】
博客园 - Franky
Cyberwarzone
Cyberwarzone
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cisco Blogs
T
Tailwind CSS Blog
Project Zero
Project Zero
博客园 - 叶小钗
S
SegmentFault 最新的问题
K
Kaspersky official blog
B
Blog
T
The Exploit Database - CXSecurity.com
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
G
Google Developers Blog
Security Latest
Security Latest
T
Tenable Blog
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
H
Help Net Security
T
Threat Research - Cisco Blogs
美团技术团队
AWS News Blog
AWS News Blog
P
Proofpoint News Feed
F
Fortinet All Blogs
NISL@THU
NISL@THU
大猫的无限游戏
大猫的无限游戏
The Last Watchdog
The Last Watchdog
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
D
DataBreaches.Net

动物的光合作用

使用 Peer Relay 提高 Tailscale 的速度 内网穿透下 NAS 使用 DNS 轮循作为负载均衡 <众安车保>上当指南 - 动物的光合作用 我的自建 NAS - 动物的光合作用 React 组件中复用代码的方式 - 动物的光合作用 负载均衡下的前端资源更新策略 - 动物的光合作用 CSS 基于视区的长度单位 - 动物的光合作用 Excalidraw 支持自定义字体 - 动物的光合作用 我用 Docker 部署的一些服务 - 动物的光合作用 CSS 书写模式和逻辑属性 - 动物的光合作用 大量活动页面持续性维护的解决方案 - 动物的光合作用 Mac mini 搭建外网可访问的简易 NAS - 动物的光合作用 React Fragment 添加事件监听? - 动物的光合作用 如何在 React 解决竞态条件 - 动物的光合作用 使用脚本备份 Github 仓库 - 动物的光合作用 高性能 React 应用的几个小技巧 - 动物的光合作用 复习 DOM 事件 - 动物的光合作用 我的博客架构变迁之路 - 动物的光合作用 浏览器和 JavaScript 的一些新特性 - 动物的光合作用 useCallback 的误区 - 动物的光合作用 在 React 中使用事件分离状态 - 动物的光合作用 如何处理 RESTFUL 数据异常导致的前端错误 - 动物的光合作用 基于 Node.js 的 WebFont 解决方案
JS 中的 Shebang/Hashbang - 动物的光合作用
mebtte · 2023-12-13 · via 动物的光合作用

把一段 Shell 脚本保存成文本文件:

# hello.sh
echo 'Hello World'

我们可以通过两种方式运行, 第一种是 Shell 命令加脚本文件:

sh hello.sh
bash hello.sh
zsh hello.sh

第二种是赋予脚本文件可执行权限直接执行:

chmod +x hello.sh
./hello.sh

对于 JS 脚本文件, 我们通常是通过命令加脚本文件的方式:

// index.js
console.log('Hello World');
node index.js

如果赋予 JS 脚本可执行权限直接运行会提示错误:

chmod +x index.js
./index.js
# ./index.js: line 1: syntax error near unexpected token `"Hello World"'
# ./index.js: line 1: `console.log("Hello World");'

这是因为直接执行脚本文件默认调用的是当前 Shell, 而 JS 不是合法的 Shell 语法. 不过在类 Unix 系统中, 存在一种称为 Shebang 的语法, 在脚本文件开头以 #! 开头加上解释器指令, 当前脚本将会以指定的解释器执行, 例如下面的例子, 将会调用 zsh 执行, 当然也可以修改成其他的 Shell 程序, 比如 #!/bin/sh/#!/bin/bash.

Shebang 由 Sharp 和 Bang 两部分组成, # 常常被称为 Sharp, 比如微软推出的编程语言 C# 读作 C Sharp, 而 ! 被称为 Bang. 此外 Shebang 也被称为 Hashbang, 因为 # 也被称为 Hash.

#!/bin/zsh
echo 'Hello World'

所以对于上面的 JS 脚本, 我们可以添加 Shebang 指定 node 运行:

#!/usr/bin/node
console.log('Hello World');

每个人的环境都不一样, 如果 node 不位于 /usr/bin/node 怎么办? 一般来说有两种方法, 第一是通过 where 查找 node 所在的位置:

where node
# /opt/homebrew/bin/node

另一种方法是通过 env, env 能够帮我们找到正确的解释器:

#!/usr/bin/env node
console.log('Hello World');

Shebang 能够在 Shell 中正常地发挥作用, 是因为 # 是 Shell 脚本中的注释语法, 解释器会忽略 Shebang 从而正常执行. 但是 # 在 JS 中不是合法的注释, 所以 node 或者 deno 这些 JS 运行时需要特殊处理从而达到兼容 Shebang 的目的.

不同于 node 或者 deno 的特殊处理, 浏览器中的 JS 引擎并不会识别到 Shebang, 如果一个 JS 脚本带有 Shebang 会被浏览器认为是语法错误. 为了解决这个问题, ECMAScript 2023 中正式通过了 Hashbang 提案.

为什么称为 Hashbang 而不是 Shebang, 主要是因为 JS 中 # 通常称为 Hash 而不是 Sharp.

目前基本所有的浏览器都支持了 Hashbang, 对于服务端和客户端同构的 JS 脚本我们不需要再关心 Hashbang 的问题.

Alt text
Alt text

使用 Discussions 讨论 Github 上编辑 分享到 X