zsh中如何实现bash式的命令型环境变量展开功能?
zsh中如何实现bash式的命令型环境变量展开功能?
嗨,这个问题我平时帮人排查shell脚本时碰到过好多次,咱们来理清楚原因和解决办法~
首先得明白为什么bash能行而zsh不行:bash在展开像$FC这种包含空格的环境变量时,默认会自动把变量内容按空格拆分成命令+参数两部分;但zsh的默认行为不一样,它会把$FC的整个值当成单个命令名称去查找,这就导致它会去找一个叫gfortran -O3 -ffree-line-length-none的命令,自然会报“command not found”的错误。
下面给你几个可行的解决办法,按推荐程度排序:
方法1:用数组定义变量(最推荐,安全且符合zsh习惯)
zsh对数组的支持比bash更完善,咱们直接把FC定义成数组,这样zsh就能正确识别命令和参数:
# 在.zshrc里添加这行 FC=(gfortran -O3 -ffree-line-length-none)
之后在终端里直接运行:
$FC main.f90
就能和bash里的效果完全一致,正确调用gfortran并传入参数编译代码。
方法2:用eval强制展开(简单但需注意安全)
如果不想改变量的定义方式,可以用eval命令来让zsh像bash一样解析变量内容:
eval $FC main.f90
不过要注意:如果FC变量里包含特殊字符(比如通配符、引号),eval可能会带来意外的解析问题,所以只推荐在你完全控制变量内容的场景下使用。
方法3:开启shwordsplit选项(不推荐,影响全局行为)
zsh有个shwordsplit选项,开启后会让zsh的变量展开行为和bash一致,自动按空格拆分内容。你可以在.zshrc里添加:
setopt shwordsplit
之后原来的export FC="gfortran -O3 -ffree-line-length-none"就能正常工作了。但这个选项会改变所有变量的展开规则,可能会让一些依赖zsh默认行为的脚本出问题,所以除非你确定不会有冲突,否则不建议用这个方法。
备注:内容来源于stack exchange,提问作者Ronpac
相关产品推荐
相关产品推荐

