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 顶部后它可以工作了。
我的远程服务器 (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 顶部后它可以工作了。