为何我的Shell别名定义函数中declare语句无法生效?
问题描述
在.zshrc里定义了这个函数:
define_shortcut() { declare "$1"="$2" alias $1="cd $2" }
调用的时候写了:
define_shortcut $alerts /Users/home/config/alerts/
结果别名alerts能正常用(实际是alerts被设为cd /Users/home/config/alerts/的别名),但执行echo $alerts却显示变量未定义,declare这行完全没起作用。
问题原因及解决办法
传参写错了,导致
declare白跑
调用函数时第一个参数用了$alerts,但这时候alerts变量根本还没定义,$alerts展开后就是空字符串。这让declare语句变成了declare ""="/Users/home/config/alerts/",这明显是无效语法,自然创建不了变量。正确的传参应该直接写变量名alerts,别加$:define_shortcut alerts /Users/home/config/alerts/declare默认造的是局部变量
就算传参改对了,zsh里函数内用declare定义的变量默认是局部变量,函数执行完就会被销毁,外部根本访问不到。要定义全局变量,得给declare加-g选项:define_shortcut() { declare -g "$1"="$2" alias $1="cd $2" }
改完之后,调用define_shortcut alerts /Users/home/config/alerts/,别名和全局变量alerts就都能正常工作了,执行echo $alerts会输出/Users/home/config/alerts/。
内容的提问来源于stack exchange,提问作者MCI
相关产品推荐
相关产品推荐

