我想和别人分享一个脚本,但不确定在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
我想和别人分享一个脚本,但不确定在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
对于所编写的脚本,你应该选择与其相应的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 bash和Why does my bash code fail when I run it with sh?
*以这种方式使用env
等价于#!/bin/bash
,但也允许用户安装更新的Bash版本。特别是macOS上的人们这样做,因为操作系统附带有过时的版本。
这并不重要:使用脚本的人需要确保 shebang 在他们的机器上选择了正确的解释器,所以无论你提供什么都可能在接收端发生变化。
你能做的就是记录执行你的脚本所需的要求。(例如,“需要 bash 4.2 或更高版本”。)你可以完全省略 shebang,因为你依赖用户知道所需解释器的位置。
/bin/sh
可能是最安全的选择吗? - terryoboybash
扩展时,才能这样做。脚本的内容很重要,而且shebang必须反映出来。(无论你放什么,用户可能需要更改它。也许你使用了一些需要bash
4或更高版本的功能,但是在macOS上/bin/bash
是3.2版本。用户将不得不安装自己的更新版本的bash
,并更改shebang以反映他们安装它的位置。作为脚本作者,您不知道也不关心适当的解释器位于何处。) - chepner#!/bin/echo Please edit this script and set the correct path to bash
或其他类似的方式。 - that other guy
/bin/bash
的版本(3.2)比你习惯使用的bash
版本(4.2或更高)要旧得多。所以问题是:你的脚本需要运行哪个shell? - chepner/bin/sh
通常意味着你的脚本符合 POSIX 标准,并且可以在任何符合 POSIX 标准的shell(如dash
、ash
、兼容模式下的bash
、zsh
等)上运行而无需修改。/bin/bash
表示你需要bash
,但不指定所需的bash
版本。 - chepner#!/usr/bin/env bash
,因为它会在PATH
中查找位置。当然,您需要进行显式版本检查;例如:case $BASH_VERSION in ''|[123].*) echo "错误:需要Bash 4.0+" >&2; exit 1;; esac
- Charles Duffyenv
,因为它告诉用户他们可以使用任何他们喜欢的bash
,而作者并没有确定这是否适合该脚本。 - chepnersh
而不是bash的指导。 - Charles Duffy