在 macOS 上,#!/bin/bash
意味着脚本将使用系统 bash,它非常过时(3.2,2006 年)并且(至少对我自己而言)几乎没用。
然后,您可以使用 Homebrew 或 MacPorts 安装现代 bash,并使用如下命令:
#!/usr/bin/env bash
但这种env
方法并不可靠:如果你在只安装了系统 bash 的 Mac 上运行此脚本会怎么样?那么,env
将改用 bash 3.2(我想……),这将导致脚本行为异常,从而造成危害。
那么第三种方法是
#!/opt/homebrew/bin/bash
但是,如果你在使用 MacPorts 而不是 Homebrew 安装了现代 bash 的 Mac 上运行此脚本,会怎么样?
这里的最佳做法是什么?(也许创建一个/usr/local/bin
指向的符号链接/opt/homebrew/bin/bash
,然后#!/usr/local/bin
?)
#!/usr/bin/env bash
是最佳实践,env 是所有 shebang 的最佳实践。无论是否是 MacOS,都不能保证您的目标系统安装的 bash 版本与您在其上编写脚本的系统相同。如果您想要真正的可移植性,您需要使用
#!/bin/sh
,即使这样,您也需要知道哪些真正的 POSIX 命令和方法可用,因为在许多系统上 /bin/sh 只是 bash--posix
模式的符号链接,并且仍然允许非 posix 的东西,例如数组。此外,您无法控制所使用的任何外部命令awk
、sed
、grep
等,并且这些命令会因系统而异。在 macOS 上,全新安装 hombrew 后,$PATH 为
因此,由于 homebrew 将其 bin 目录放在 /bin 之前
$PATH
,并且shell 在寻找可执行文件时会从头到尾遍历 此 变量#!/usr/bin/env bash
,所以它可以很好地运行 bash 5 。