相关疑难解决方法(0)

为什么最好使用“#!/usr/bin/env NAME”而不是“#!/path/to/NAME”作为我的shebang?

我注意到我从其他人那里获得的一些脚本有 shebang#!/path/to/NAME而其他人(使用相同的工具,NAME)有 shebang #!/usr/bin/env NAME。

两者似乎都可以正常工作。在教程中(例如在 Python 上),似乎有人建议后者 shebang 更好。但是,我不太明白为什么会这样。

我意识到,为了使用后一个 shebang,NAME 必须在 PATH 中,而第一个 shebang 没有这个限制。

此外,(对我而言)第一个似乎是更好的shebang,因为它精确地指定了NAME 所在的位置。因此,在这种情况下,如果 NAME 有多个版本(例如,/usr/bin/NAME、/usr/local/bin/NAME),第一种情况指定使用哪个。

我的问题是为什么第一个shebang比第二个更受欢迎?

shell-script shebang

588
推荐指数
10
解决办法
25万
查看次数

如何在 bash 的干净环境中运行程序?

我想在一个空的环境中运行一个程序(即没有设置 envariables)。如何在 bash 中做到这一点?

bash environment-variables

151
推荐指数
5
解决办法
10万
查看次数

shebang中的多个参数

我想知道是否有通过 shebang 行 ( #!)将多个选项传递给可执行文件的通用方法。

我使用 NixOS,在我编写的任何脚本中,shebang 的第一部分通常是/usr/bin/env. 然后我遇到的问题是系统将其后的所有内容解释为单个文件或目录。

例如,假设我想编写一个脚本以bash在 posix 模式下执行。写shebang的天真方式是:

#!/usr/bin/env bash --posix
Run Code Online (Sandbox Code Playgroud)

但是尝试执行生成的脚本会产生以下错误:

/usr/bin/env: ‘bash --posix’: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我知道这篇文章,但我想知道是否有更通用和更清洁的解决方案。


编辑:我知道对于Guile脚本,有一种方法可以实现我想要的,在手册的第 4.3.4 节中记录:

 #!/usr/bin/env sh
 exec guile -l fact -e '(@ (fac) main)' -s "$0" "$@"
 !#
Run Code Online (Sandbox Code Playgroud)

这里的技巧是,第二行(以 开头exec)被解释为代码,sh但是,在#!...!#块中,作为注释,因此被 Guile 解释器忽略。

难道不能将此方法推广到任何解释器吗?


第二次编辑:在玩了一会儿之后,似乎对于可以从中读取输入的解释器,stdin以下方法可以工作:

#!/usr/bin/env sh
sed '1,2d' "$0" | bash --verbose --posix …
Run Code Online (Sandbox Code Playgroud)

scripting environment-variables posix arguments shebang

68
推荐指数
5
解决办法
2万
查看次数