我在很多地方看到,包括这个网站的建议(What is the preferred Bash shebang?),推荐使用#!/usr/bin/env bash
而不是#!/bin/bash
。我甚至看到有人建议使用#!/bin/bash
是错误的,这样做会丢失bash功能。
虽然我在一个高度控制的测试环境中使用bash,其中每个驱动器基本上都是单个主驱动器的克隆品。我理解可移植性的论点,但在我的情况下并不一定适用。除了可移植性之外,是否有其他原因优先考虑#!/usr/bin/env bash
而不是其他选择?在假设可移植性是一个问题时,使用它是否会破坏功能?
env
可能不位于/usr/bin
。在我看来,shebang 注释本质上是一个不良的想法。如果您的默认脚本解释器不处理 shebang 注释,那么它只是一条注释。然而,如果您知道脚本解释器可以处理 shebang 注释,并且您知道 bash 的路径,那么没有理由不使用其绝对路径调用它,除非路径过长(不太可能),或者您可能将脚本移植到没有将 bash 位于 /bin 的系统中。再次强调,这种情况涉及可移植性,需要注意上述的警告事项。 - user539810/etc
或/bin/sh
等文件必须存在。对于大多数类Unix系统,bash
是一种附加组件。仅在Linux系统中,bash
才保证位于/bin
目录下,并且很可能也链接到/bin/sh
。由于Linux成为许多人现代实际使用的Unix系统,因此已经忘记了除Linux以外的其他系统也可能存在。在下面的回答中,我假设您使用的是Linux,因为您提到了bash
。我曾经使用过的许多BSD系统甚至没有安装bash
。 - Sean Perry/bin/bash
。Bash不是默认安装的,如果您想要它,必须使用pkg install bash
进行安装。一旦安装完成,它将位于/usr/local/bin/bash
。在OpenBSD上,没有任何东西安装在/bin/bash
位置。使用#!/bin/bash
作为shebang会出错,而使用#!/usr/bin/env bash
则会成功。 - jww