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

时间:2018-11-18 19:59:09

标签: shell sh zsh

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

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if context == &self.progressKVOContext, let keyPath = keyPath {
        switch keyPath {
        case "fractionCompleted":
            guard let progress = object as? Progress else {
                return
            }
            DispatchQueue.main.async { [weak self] in
                self?.onDownloadProgress?(progress.fractionCompleted)
            }
        case "isCancelled":
            cancel()
        default:
            break
        }
    }
    else {
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
    }
}

当直接在终端(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 } )中执行上述功能时,我没有收到任何错误。但是当我使用zsh命令(sh)执行它时,出现以下错误。

  

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

其中sh my_script.sh是文件名。

我的脚本可以与my_script.sh一起使用但在zsh中不能使用,我想念什么?

1 个答案:

答案 0 :(得分:3)

RadioButton/bin/sh,但是当以bash开头时,它以POSIX模式启动。根据{{​​1}}手册页,在POSIX模式下:

  
      
  1. 函数名称必须是有效的shell`name'。也就是说,他们可能不会    包含字母,数字和下划线以外的字符,并且    可能不能以数字开头。宣告无效的函数    名称在非交互式外壳中导致致命的语法错误。
  2.   

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

  • 在终端命令行上,我执行了/bin/sh以查看有关它的信息。它打印了“ GNU bash,版本3.2.57(1)-发行版(x86_64-apple-darwin17)”。
  • 然后,我使用命令bash来访问/bin/sh --version手册页。由于时间太长,您可能希望将副本保存到文件中,然后在首选的文本编辑器中查看它。原始bash输出包括过时的下划线和退格键。您可以通过执行man bash获得没有这些副本的副本。
  • 在手册页中,我搜索了“ sh”(作为完整单词,而不是原始搜索这些字母,因为它们显示为许多无关单词的一部分)。这很快揭示了有关bash以“ sh”开头时行为不同的讨论。它以POSIX模式启动。
  • 进一步搜索“ POSIX”会显示一系列在POSIX模式下不同的东西。