如何停止bash的语法检查源文件?


9

我的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

SHELLNAMEzsh如果外壳程序是zsh并且bash外壳程序是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

bash  zsh 

Answers:


14

您只需要一个评估。

[ -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有意义的。


感谢您将我只能想到的8-)语言代码。
slm

15

与其尝试使Bash不进行语法检查,不如让您的脚本在仅被正确的shell调用时才执行该源代码的来源。


该文件来自bash和zsh。我正在考虑将特定于zsh的部分拆分为自己的文件。

6
是的,那正是我会做的。以后为自己和将来加入代码的任何人提供维护和支持会更加清楚。在代码中,我总是尝试显式而不是聪明。
slm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.