首页 > 解决方案 > 如何在不破坏浏览器支持的情况下将 hashbang 添加到可执行的 Javascript 文件?

问题描述

是否有可能有这样的代码:

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

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

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

我想不出办法。有任何想法吗?

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

标签: javascriptnode.jsbashtypescript

解决方案


如果您只使用过 bash,则可以利用 bash 的一项功能(?!):bash 使用 bash 执行脚本而无需 shebang。其他外壳程序可能会将其留给通常使用的操作系统/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将文件的其余部分提供给节点,然后退出:

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。///路径开头的 不应该引起问题 - 路径开头的三个或更多等同/于单个/.

但我强烈建议您改用包装脚本,正如评论所建议的那样。


推荐阅读