带有注释的源多行命令中的“未找到命令:#”

带有注释的源多行命令中的“未找到命令:#”

foo.sh,为了便于阅读,我将一些命令(或函数)拆分为多行并添加了注释:

#!/bin/zsh
#
# foo.sh: print computer information

foo() {
    uname \
        -p `# processor arch` \
        -s `# os name` \
        -v `# os version`
}

foo

什么有效

我可以正常运行:

$ ./foo.sh
Darwin 123... (correct output)

什么不起作用

但是,如果我使用sourceor获取它.,我的 shell 会报告以下错误,尽管它本身使用我指定的参数 ( ) 成功运行了命令-psv

% . ./foo.sh
./foo.sh:2: command not found: #
./foo.sh:2: command not found: #
./foo.sh:2: command not found: #
Darwin 123... (correct output as before)

我想知道为什么会出现这种情况?我该如何解决它?因为我的主要目标是定义一些函数,获取它们,并根据需要在 shell 中调用它们。谢谢你!

答案1

默认情况下,zsh 仅识别脚本中的注释,而不能识别交互运行时的注释。这应该适用于源脚本,但在最近的版本中(我在 5.8 中重现了此行为,但 5.4.2 可以很好地接受您的代码),这也适用于加载后解析的某些代码,例如命令替换中的代码。这可能是一个错误。

setopt interactive_comments.zshrc交互式运行时支持评论。这实际上并没有什么缺点:这意味着您必须#在单词的开头引用,但#很少出现在命令行上单词的开头。 (在一个单词中不会开始注释,因此这不会影响用作通配符或在参数扩展中#的使用。)#extended_glob

或者(或另外),添加

setopt local_options interactive_comments

函数内部。然后评论就起作用了。

相关内容