Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用在任何地方都有效的非系统依赖的bash shebang(而不是#!/bin/bash)?_Bash_Shell_Path_Environment Variables_Shebang - Fatal编程技术网

使用在任何地方都有效的非系统依赖的bash shebang(而不是#!/bin/bash)?

使用在任何地方都有效的非系统依赖的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解释器显然不总是在同一个位置,那么在脚本中显式使用硬编码路径难道不是完全错误的吗 我知道您可以使用更灵活或更少依赖于系统的

我通常会在shell脚本的顶部放一个bash的shebang,例如:

#/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

  • 可以想象,
    env
    的路径可能不同,也可能不存在。(POSIX规范的第一个版本中没有
    env
    命令。)


这可能会有帮助:或者@Cyrus,我明白了,谢谢。
/usr/bin/env
是否“保证”存在?或者至少比
/usr/bin/bash
更重要?否则它仍然会遇到同样的问题。只需使用#/usr/bin/env bash。搞砸了的系统会失败,但你已经尽了最大努力,而且你无论如何也无法解开它们。@Roadowl不幸的是,使用
env
使脚本不仅依赖于系统,而且依赖于过程开始时的环境(特别是
路径
)。因此,同一台计算机上完全相同的脚本可能在不同的解释器下运行,这取决于它的启动方式。