如何阻止 bash 对源文件进行语法检查?

如何阻止 bash 对源文件进行语法检查?

我在一个由 zsh 和 bash 来源的文件中有以下代码。

if test $SHELLNAME = zsh ; then
    lss() { l -l ${1:-.}/*(s,S,t); }
    laf() { l ${1:-.}/.*(.); }
    lad() { l -d ${1:-.}/.*(/); }
    lsw() { l -ld ${1:-.}/.*(R,W,X.^ND/); }
fi

SHELLNAMEzshshell 是否为 zsh 以及bashshell 是否为 bash。

上述每个函数都包含适用于 zsh 的代码,但不适用于 bash。

当我获取此文件时,我收到以下错误。

bash: <filename>: line 67: syntax error near unexpected token `('
bash: <filename>: line 67: `     lss() { l -l ${1:-.}/*(s,S,t); }'

目前,我正在用来eval绕过 bash 的语法检查。

if test $SHELLNAME = zsh ; then
    # Using eval makes sure bash can't try to syntax-check these functions.
    eval 'lss() { l -l ${1:-.}/*(s,S,t); }'
    eval 'laf() { l ${1:-.}/.*(.); }'
    eval 'lad() { l -d ${1:-.}/.*(/); }'
    eval 'lsw() { l -ld ${1:-.}/.*(R,W,X.^ND/); }'
fi

对于这个问题有更好的解决方案吗? (也许不使用eval

答案1

与其尝试让 Bash 不进行语法检查,为什么不让执行此操作的脚本仅在正确的 shell 调用它时才获取它。

答案2

您只需要一次评估。

[ -n "$ZSH_VERSION" ] &&
  eval '
    lss() l -l ${1:-.}/*(s,S,t)
    laf() l ${1:-.}/.*(.)
    lad() l -d ${1:-.}/.*(/)
    lsw() l -ld ${1:-.}/.*(R,W,X.^ND/)
  '

(请注意,zshbash支持 Bourne 函数语法相反)

或者:

[ -n "$ZSH_VERSION" ] && . /dev/fd/3 3<< '# End of zsh specific section'
  lss() l -l ${1:-.}/*(s,S,t)
  laf() l ${1:-.}/.*(.)
  lad() l -d ${1:-.}/.*(/)
  lsw() l -ld ${1:-.}/.*(R,W,X.^ND/)
# End of zsh specific section

但我倾向于同意slm,将zsh特定语法放在仅由其提供的单独文件中zsh是有意义的。

相关内容