MacOS更喜欢使用/bin/bash还是/bin/sh?

3

我想和别人分享一个脚本,但不确定在MacOS上哪种方式更好。哪一种得到了最好的支持?

是这个吗?

#!/bin/sh
echo "Here goes my simple script that changes some settings."
# ... do some stuff

或者这个?
#!/bin/bash
echo "Here goes my simple script that changes some settings."
# ... do some stuff

2
重要的不是什么是“首选”,而是什么是“可行”的。Shebang没有指定需要哪个版本的shell。考虑到你的问题,你可能不知道在macOS机器上/bin/bash的版本(3.2)比你习惯使用的bash版本(4.2或更高)要旧得多。所以问题是:你的脚本需要运行哪个shell? - chepner
3
/bin/sh 通常意味着你的脚本符合 POSIX 标准,并且可以在任何符合 POSIX 标准的shell(如dashash、兼容模式下的bashzsh等)上运行而无需修改。/bin/bash 表示你需要 bash,但不指定所需的 bash 版本。 - chepner
1
如果您想使用比操作系统提供的版本更新的bash副本,则更适合使用#!/usr/bin/env bash,因为它会在PATH中查找位置。当然,您需要进行显式版本检查;例如:case $BASH_VERSION in ''|[123].*) echo "错误:需要Bash 4.0+" >&2; exit 1;; esac - Charles Duffy
1
我认为这是可以回答的,因为答案是无论脚本编写者提供什么内容,都不一定对运行脚本的人有用。我不喜欢 env,因为它告诉用户他们可以使用任何他们喜欢的 bash,而作者并没有确定这是否适合该脚本。 - chepner
@CharlesDuffy为什么因为那个原因给我投反对票?这就像说我应该知道自己问题的答案一样。 - terryoboy
2
顺便提一下,https://mywiki.wooledge.org/BashGuide/Practices#Choose_Your_Shell 是直接相关的;请参阅其中的始终使用正确的shebang项目,以及该点上方关于何时考虑使用sh而不是bash的指导。 - Charles Duffy
2个回答

9

对于所编写的脚本,你应该选择与其相应的shell语言的shebang。

  • 如果你是为POSIX sh编写的,请使用#!/bin/sh

  • 如果你是为Zsh编写的,请使用#!/usr/bin/env zsh

  • 如果你是为Fish编写的,请使用#!/usr/bin/env fish

  • 如果你是为Bash编写的,请使用#!/usr/bin/env bash*(如果你不知道,那么很可能是这个)

sh相当于bash就像C相当于C++一样,你应该了解你想要使用哪一个。更多信息,请参见Difference between sh and bashWhy does my bash code fail when I run it with sh?


*以这种方式使用env等价于#!/bin/bash,但也允许用户安装更新的Bash版本。特别是macOS上的人们这样做,因为操作系统附带有过时的版本。


-2

这并不重要:使用脚本的人需要确保 shebang 在他们的机器上选择了正确的解释器,所以无论你提供什么都可能在接收端发生变化。

你能做的就是记录执行你的脚本所需的要求。(例如,“需要 bash 4.2 或更高版本”。)你可以完全省略 shebang,因为你依赖用户知道所需解释器的位置。


谢谢。这很有道理,我认为这就是答案... 那么使用/bin/sh可能是最安全的选择吗? - terryoboy
2
只有在脚本中不使用任何bash扩展时,才能这样做。脚本的内容很重要,而且shebang必须反映出来。(无论你放什么,用户可能需要更改它。也许你使用了一些需要bash 4或更高版本的功能,但是在macOS上/bin/bash是3.2版本。用户将不得不安装自己的更新版本的bash,并更改shebang以反映他们安装它的位置。作为脚本作者,您不知道也不关心适当的解释器位于何处。) - chepner
1
如果省略shebang,脚本仍然可以运行,但现在很难预测它将与哪个解释器一起运行。我不同意用户应该经常编辑每个脚本来设置shebang,但如果这是目标,您可以使用#!/bin/echo Please edit this script and set the correct path to bash或其他类似的方式。 - that other guy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接