fabfile 看不到远程环境变量

fabfile doesn't see remote environment variables

我的远程服务器 (192.168.3.68) 包含在我的 ~/.bashrc 中设置的几个环境变量:

# For instance
export MY_DATABASE_HOST=127.0.0.1

当我在fabfile.py中输入run('echo $MY_DATABASE_HOST')时,它显示:

[192.168.3.68] run: echo $MY_DATABASE_HOST
[192.168.3.68] output:

Done
Disconnecting from 192.168.3.68... done.

我试过在回显之前添加 run('source ~/.bashrc') 但没有任何变化。

为什么 ~/.bashrc 中设置的环境变量对 fabfile 不可见?

我该怎么做才能解决这个问题,因为 fabfile 必须能够读取这些变量?

更新

from fabric.context_managers import prefix

# This didn't work
with prefix('source /home/meandme/.bashrc'):
    run('echo $MY_DATABASE_HOST')
# This didn't work either
run('source /home/meandme/.bashrc && echo $MY_DATABASE_HOST')

每次调用 run 都会打开一个新的 shell 并且之前调用 run 中的任何临时命令都将丢失(例如,设置环境变量) .要消除此问题,您可以做两件事:

这样写你的 shell 命令:

run('source /path/to/.bashrc && echo $MY_DATABASE_HOST')

或使用 prefix 上下文管理器

from fabric.context_managers import prefix
with prefix('source /path/to/.bashrc'):
    run('echo $MY_DATABASE_HOST')

实际上执行了bashrc。但是它被停止了,因为它不是 运行 通过这个交互:

case $- in
     *i*) ;;
     *) return;;
esac

现在我将我的环境变量移到我的 bashrc 顶部后它可以工作了。

这里有更详细的答案https://github.com/fabric/fabric/issues/1519