我有一个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
中不能使用,我想念什么?
答案 0 :(得分:3)
RadioButton
是/bin/sh
,但是当以bash
开头时,它以POSIX模式启动。根据{{1}}手册页,在POSIX模式下:
- 函数名称必须是有效的shell`name'。也就是说,他们可能不会 包含字母,数字和下划线以外的字符,并且 可能不能以数字开头。宣告无效的函数 名称在非交互式外壳中导致致命的语法错误。
关于如何弄清楚这样的事情的说明:
/bin/sh
以查看有关它的信息。它打印了“ GNU bash,版本3.2.57(1)-发行版(x86_64-apple-darwin17)”。bash
来访问/bin/sh --version
手册页。由于时间太长,您可能希望将副本保存到文件中,然后在首选的文本编辑器中查看它。原始bash
输出包括过时的下划线和退格键。您可以通过执行man bash
获得没有这些副本的副本。