使用在任何地方都有效的非系统依赖的bash shebang(而不是#!/bin/bash)?
我通常会在shell脚本的顶部放一个bash的shebang,例如:使用在任何地方都有效的非系统依赖的bash shebang(而不是#!/bin/bash)?,bash,shell,path,environment-variables,shebang,Bash,Shell,Path,Environment Variables,Shebang,我通常会在shell脚本的顶部放一个bash的shebang,例如: #/usr/bin/bash 然而,我看到了许多其他的变体,比如#/bin/bash或#/usr/local/bin/bash等 在我看来,这些不同的约定会导致兼容性或可移植性问题。如果我的bash位于其他人的位置以外的其他位置,那么我的脚本将无法在他们的机器上工作,反之亦然 如果像bash这样的shell解释器显然不总是在同一个位置,那么在脚本中显式使用硬编码路径难道不是完全错误的吗 我知道您可以使用更灵活或更少依赖于系统的
#/usr/bin/bash
然而,我看到了许多其他的变体,比如#/bin/bash
或#/usr/local/bin/bash
等
在我看来,这些不同的约定会导致兼容性或可移植性问题。如果我的bash位于其他人的位置以外的其他位置,那么我的脚本将无法在他们的机器上工作,反之亦然
如果像bash这样的shell解释器显然不总是在同一个位置,那么在脚本中显式使用硬编码路径难道不是完全错误的吗
我知道您可以使用更灵活或更少依赖于系统的方法,如下所示:
#/usr/bin/env bash
这将导致(或?)本地版本的bash,无论安装在何处
后一种变体总是有效吗?或者,有没有更好的方法能够最大程度地引用任何系统的bash,而不管它安装在哪里?我建议使用“#!/bin/bash”或“#!/usr/bin/bash”。在现代Linux发行版上,bash
应该安装在这两个地方
显然,OpenBSD不是这样的。。。它使用ksh
作为默认shell。但是在OpenBSD系统上,您可能会发现根本没有安装bash
。这显然是一个可选的软件包,管理员可能没有安装它
因此,如果您想最大限度地提高可移植性,请使用“/bin/sh”,并将自己限制为标准POSIX shell语法和命令。“/bin/sh”通常是指向bash
或ksh
的链接,并在POSIX兼容模式下运行
其他变化:
- “#!/usr/local/bin/bash”通常在Linux上不起作用。如果有,它可能会为您提供本地构建/修改版本的
bash
- “#!/usr/bin/env bash”应该可以使用,但需要注意以下几点:
- 这将为您提供用户命令搜索路径(即,
)上第一个版本的$path
bash
- 可以想象,
的路径可能不同,也可能不存在。(POSIX规范的第一个版本中没有env
命令。)env
/usr/bin/env
是否“保证”存在?或者至少比/usr/bin/bash
更重要?否则它仍然会遇到同样的问题。只需使用#/usr/bin/env bash。搞砸了的系统会失败,但你已经尽了最大努力,而且你无论如何也无法解开它们。@Roadowl不幸的是,使用env
使脚本不仅依赖于系统,而且依赖于过程开始时的环境(特别是路径
)。因此,同一台计算机上完全相同的脚本可能在不同的解释器下运行,这取决于它的启动方式。