javascript - 如何在不破坏浏览器支持的情况下将 hashbang 添加到可执行的 Javascript 文件?

标签 javascript node.js bash typescript

是否可以有这样的代码:

#! /usr/local/bin/node
console.log("Hello world")

我也可以在浏览器中运行吗?

我有一个在本地运行的脚本,想在浏览器中运行它,但现在我需要为浏览器目标“重新编译”它,只是为了删除 hashbang 行。

我想不出解决办法。有什么想法吗?

编辑:我的用途是我不想拥有 2 个文件,因为我希望能够在处理当前文件的同时执行它,并通过网络提供它。我认为解决方案必须是为浏览器将其编译为第二个文件或使用 #!这与 javascript 配合得很好。

最佳答案

如果您只使用 bash,您可以利用 bash 的一项功能(?!):bash executes scripts without a shebang using bash .其他 shell 可能会将其留给操作系统,操作系统通常会使用 /bin/sh 代替。例如:

bash-5.0$ echo 'echo $1 $BASH_VERSION' > foo.sh
bash-5.0$ for sh in sh bash dash ksh zsh; do $sh -c "./foo.sh $sh"; done
sh 3.2.57(1)-release
bash 5.0.7(1)-release
dash 3.2.57(1)-release
ksh
zsh 3.2.57(1)-release

(/bin/sh 是 macOS 上旧版本 bash 的链接。)

所以,你可以有这样一个文件:

///usr/local/bin/node <(tail -n +1 "$0"); exit $?
console.log("Hello world")

如果您在浏览器或其他运行 JavaScript 的方式中运行它,则第一行应该作为注释被忽略。

如果您在 bash 中将其作为脚本运行,第一行告诉它运行 ///usr/local/bin/node,使用带有 tail 的进程替换将文件的其余部分提供给 Node ,然后退出:

bash-5.0$ cat foo.js
///usr/local/bin/node <(tail -n +1 "$0"); exit $?
console.log("Hello world")
bash-5.0$ ./foo.js
Hello world

这个技巧也适用于 ksh。路径开头的 /// 不应引起问题 - 路径开头的三个或更多 / 等同于单个 /.

但我强烈建议您按照评论中的建议改用包装脚本。

关于javascript - 如何在不破坏浏览器支持的情况下将 hashbang 添加到可执行的 Javascript 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56353088/

相关文章:

javascript - document.getElementById——它如何与 onchange 事件一起工作?

javascript - 当元素高度不够时如何强制滚动

node.js - 如何获取 NodeJS 客户端 ID?

node.js - Sequelize findAndCountAll 并计算包含的模型

c# - Express (NodeJS) 无法处理来自 Xamarin Android 应用程序的 Post

linux - 复合命令的第二行和后续行是否不受 bash 中的 HISTCONTROL 影响?

linux - 是什么导致在 find 中执行 -type f 的时间增加

javascript - 编辑 HTML 表格的源数据

java - 如何在Windows机器上远程执行.sh文件

javascript - 如何使用 d3 从嵌套的 JSON 数组中调用数据?