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

MacOS更喜欢/bin/sh还是/bin/bash?,bash,macos,shell,terminal,Bash,Macos,Shell,Terminal,我想和别人分享一个脚本,但不确定哪一个是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 还是这个? #!/bin/sh echo

我想和别人分享一个脚本,但不确定哪一个是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
还是这个?

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

这其实并不重要:由使用脚本的人来确保shebang在他们的机器上选择了正确的解释器,因此您提供的任何内容都会在接收端发生变化


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

您应该选择与脚本编写时使用的shell方言/语言相对应的shebang

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

  • 如果您为Zsh编写,请使用
    #/usr/bin/env zsh

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

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

<代码> SH 是<代码> BASH >大致C是C++,并且应该知道你想使用哪一个。有关详细信息,请参阅和



*这样使用
env
相当于
#/bin/bash
,但也允许用户安装较新版本的bash。macOS上的用户尤其会这样做,因为该操作系统附带了过时的版本。

这与其说是首选什么,倒不如说是什么会起作用。shebang没有指定需要哪个版本的shell。考虑到您提出的问题,您可能不知道macOS机器上的
/bin/bash
可能比您习惯使用的
bash
版本(4.2或更高版本)旧得多(3.2版)。因此,问题是:您的脚本需要运行哪个shell?
/bin/sh
通常意味着您的脚本符合POSIX标准,并且可以使用任何符合POSIX标准的shell(
dash
ash
bash
zsh
在兼容模式下运行,等等)
/bin/bash
表示需要
bash
,但没有说明需要哪个版本的
bash
#/如果您想使用比操作系统提供的版本更新的bash副本,usr/bin/env bash
更合适,因为它将在
路径中查找位置。当然,您需要一个显式的版本检查;类似于“|[123].*)echo中的
case$BASH_版本错误:BASH 4.0+需要”>&2;出口1;;esac
我认为这是可以回答的,因为答案是无论脚本编写者提供什么,它都不一定对运行脚本的人有用。我不喜欢
env
,因为它告诉用户他们可以使用他们喜欢的
bash
是什么,而作者无法确定这是否适合脚本。顺便说一句,它直接涉及主题;请参阅始终使用正确的SHIBN弹头点,以及在考虑何时使用<代码> SH 时的指导,而不是在这一点之上。谢谢。这是有道理的,我认为这就是答案。。。那么使用
/bin/sh
可能是最安全的吗?只有在脚本中不使用任何
bash
扩展时才可以。重要的是剧本的内容,而剧本必须反映这一点。(无论您放置什么,用户可能需要更改它。可能您使用的某些功能需要
bash
4或更高版本,但
/bin/bash
是macOS上的3.2版。用户必须安装自己较新版本的
bash
,并更改shebang以反映其安装位置。作为脚本作者,您不需要更改它如果省略shebang,脚本仍将运行,但现在很难预测它将与哪个解释器一起运行。我不同意用户应该定期编辑每个脚本来设置shebang,但如果这是目标,您可以使用
#/bin/echo请编辑此脚本,并将正确的路径设置为bash
或其他。