zsh下.sh脚本设置环境变量失效:如何转换适配addvar函数实现正常导出
问题根源
- 报错
addvar:1: bad substitution是因为原脚本用了Bash专属的间接变量引用语法${!1},zsh默认不支持该写法 - 直接用
sh clik_profile.sh/bash clik_profile.sh无效果是因为这两种方式都会启动独立子进程执行脚本,子进程设置的环境变量不会同步到当前的zsh父会话,必须用source命令执行才会在当前会话生效
兼容zsh的修改后脚本内容
把原脚本里的addvar函数替换为兼容写法即可,完整脚本如下:
# this code cannot be run directly # do 'source /Users/henry/code/plc_3.0/plc-3.01/bin/clik_profile.sh' from your sh shell or put it in your profile function addvar () { # 兼容bash和zsh的间接变量取值逻辑 if [ -n "$ZSH_VERSION" ]; then local tmp="${(P)1}" else local tmp="${!1}" fi tmp="${tmp//:${2}:/:}" ; tmp="${tmp/#${2}:/}" ; tmp="${tmp/%:${2}/}" ; export $1="${2}:${tmp}" ; } if [ -z "${PATH}" ]; then PATH=/Users/henry/code/plc_3.0/plc-3.01/bin export PATH else addvar PATH /Users/henry/code/plc_3.0/plc-3.01/bin fi if [ -z "${PYTHONPATH}" ]; then PYTHONPATH=/Users/henry/code/plc_3.0/plc-3.01/lib/python/site-packages export PYTHONPATH else addvar PYTHONPATH /Users/henry/code/plc_3.0/plc-3.01/lib/python/site-packages fi if [ -z "${DYLD_LIBRARY_PATH}" ]; then DYLD_LIBRARY_PATH=/Users/henry/code/plc_3.0/plc-3.01/lib export DYLD_LIBRARY_PATH else addvar DYLD_LIBRARY_PATH /Users/henry/code/plc_3.0/plc-3.01/lib fi if [ -z "${DYLD_LIBRARY_PATH}" ]; then DYLD_LIBRARY_PATH=/System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Versions/Current export DYLD_LIBRARY_PATH else addvar DYLD_LIBRARY_PATH /System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Versions/Current fi if [ -z "${DYLD_LIBRARY_PATH}" ]; then DYLD_LIBRARY_PATH=/usr/local/Cellar/gcc/11.2.0/lib/gcc/11 export DYLD_LIBRARY_PATH else addvar DYLD_LIBRARY_PATH /usr/local/Cellar/gcc/11.2.0/lib/gcc/11 fi CLIK_PATH=/Users/henry/code/plc_3.0/plc-3.01 export CLIK_PATH CLIK_DATA=/Users/henry/code/plc_3.0/plc-3.01/share/clik export CLIK_DATA CLIK_PLUGIN=rel2015 export CLIK_PLUGIN
生效方式
修改保存脚本后,在zsh中执行以下命令即可立即生效:
source /path/to/your/clik_profile.sh
如果需要每次打开zsh都自动加载,把上面这条命令加到~/.zshrc文件末尾即可。
内容的提问来源于stack exchange,提问作者user1773603
相关产品推荐
相关产品推荐

