我在一个由 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
SHELLNAME
是zsh
shell 是否为 zsh 以及bash
shell 是否为 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/)
'
(请注意,zsh
与bash
支持 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
是有意义的。