Mac OSx 终端:函数定义上的“不是有效标识符”

Kan*_*thy 2 shell zsh sh

我有一个 bash 脚本,我在其中定义了以下函数,

function start-if-exists()
{
    if [ "`docker container ls -a|grep $1`" ]; then
        echo "Container $1 exists. Starting $1..."
        return `docker start $1`
    else
        echo "Container $1 doesn't exists."
        return ""
    fi
}
Run Code Online (Sandbox Code Playgroud)

zsh直接在终端()中执行上述函数时,我没有收到任何错误。但是当我使用shcommand( sh my_script.sh)执行它时,我收到以下错误。

my_script.sh:第 10 行:`start-if-exists':不是有效标识符

my_script.sh文件名在哪里。

我错过了什么我的脚本可以使用zsh但失败了sh

Eri*_*hil 7

/bin/shbash,但是,当作为/bin/sh启动时,它以 POSIX 模式启动。根据bash手册页,在 POSIX 模式下:

  1. 函数名称必须是有效的 shell 名称。也就是说,它们不能包含字母、数字和下划线以外的字符,并且不能以数字开头。使用无效名称声明函数会导致非交互式 shell 中的致命语法错误。

关于如何弄清楚这样的事情的说明:

  • 在终端命令行中,我执行/bin/sh --version以查看有关它的信息。它打印了“GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)”。
  • 然后我bash使用命令参考了手册页man bash。由于这很长,您可能更喜欢将副本保存到文件中并在您喜欢的文本编辑器中查看它。原始man输出包括古老的下划线和退格。您可以通过执行获得没有这些的副本man bash | col -b > file.txt
  • 在手册页中,我搜索了“sh”(作为一个完整的词,而不是对这些字母的原始搜索,因为它们作为许多不相关词的一部分出现)。这很快揭示了 bash 在以“sh”启动时行为不同的讨论;它以 POSIX 模式启动。
  • 进一步搜索“POSIX”会发现一系列在 POSIX 模式下不同的东西。