MacOS下.bashrc命令式环境变量新终端无法正常赋值问题
问题描述
我在~/.bashrc里设置了一个通过命令执行结果赋值的环境变量:
export PUPPETEER_EXECUTABLE_PATH=`which chromium`
打开新终端窗口执行env命令时,这个变量存在但值为空:
PUPPETEER_EXECUTABLE_PATH=
但执行source ~/.bashrc后再查看env,变量值就符合预期了:
PUPPETEER_EXECUTABLE_PATH=/opt/homebrew/bin/chromium
其他非命令式的变量能正常生效,怀疑是命令写法的问题。想问为什么首次加载.bashrc时命令结果没正确赋值?有没有更可靠的设置方式,不用每次开终端都手动source ~/.bashrc?
环境为MacOS Ventura 13.2.1,附上~/.bash_profile和~/.bashrc的内容:
~/.bash_profile 内容
[[ -s "$HOME/.bashrc" ]] && source "$HOME/.bashrc" [[ -s "$HOME/.bash_aliases" ]] && source "$HOME/.bash_aliases" # Adds brew to PATH eval "$(/opt/homebrew/bin/brew shellenv)" # Adds asdf & asdf completions to PATH . $HOME/.asdf/asdf.sh . $HOME/.asdf/completions/asdf.bash
~/.bashrc 内容
export BASH_SILENCE_DEPRECATION_WARNING=1 # 解决M1 Mac上的Puppeteer问题 export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true export PUPPETEER_EXECUTABLE_PATH=`which chromium`
原因分析
问题出在加载顺序:.bash_profile先加载了.bashrc,之后才执行brew shellenv把Homebrew的路径加入PATH。而which chromium需要依赖正确的PATH才能定位到Chromium的位置,首次加载时PATH还没包含Homebrew的路径,所以which chromium返回空,变量值自然为空。执行source ~/.bashrc时,PATH已经被brew shellenv配置完成,所以which能找到正确路径。
解决方法
有两种可靠的设置方式:
- 调整加载顺序
把source ~/.bashrc的语句移到brew shellenv和asdf配置之后,修改.bash_profile如下:
[[ -s "$HOME/.bash_aliases" ]] && source "$HOME/.bash_aliases" # Adds brew to PATH eval "$(/opt/homebrew/bin/brew shellenv)" # Adds asdf & asdf completions to PATH . $HOME/.asdf/asdf.sh . $HOME/.asdf/completions/asdf.bash # 最后加载.bashrc,确保PATH已配置完成 [[ -s "$HOME/.bashrc" ]] && source "$HOME/.bashrc"
- 直接使用绝对路径替代
which命令
既然已经明确Chromium的路径是/opt/homebrew/bin/chromium,可以直接在.bashrc里写绝对路径,完全避免依赖PATH:
export PUPPETEER_EXECUTABLE_PATH=/opt/homebrew/bin/chromium
这两种方法都能保证新终端窗口打开时,变量被正确赋值,无需每次手动执行source ~/.bashrc。
内容的提问来源于stack exchange,提问作者skwidbreth
相关产品推荐
相关产品推荐

