Shell "set" Linux 和 MacOS 中的命令

Shell "set" command in Linux and MacOS

我偶然发现了 2 个操作系统的 set 实现之间的细微差别。

当运行:

#!/bin/sh

set -eu

echo "${@}"

运行 这在 MacOS 上给出了以下错误:

@: unbound variable

而 运行 这在 Linux 环境中,结果没有错误,但回显一个空字符串。

除了将 ${@} 更改为 ${@:-} 之外,是否可以通过某种方式解决此问题,因为如果在代码中检查参数数量,这可能会导致不同的结果。

由于您在 macOS 上使用的是旧版本的 bash,因此您必须使用“$@”

您可以通过以下方式检查版本:

/bin/sh --version

您在 Linux 上的 shell 符合最新的 POSIX 标准,而 MacOS 上的则不符合(参见 spec., scroll downwards for -u; related: #0000155),因此在行为上存在差异.解决方法是:

#!/bin/sh
set -eu
echo "${1+"$@"}"