在bash脚本中重新加载环境变量

时间:2016-04-30 15:32:40

标签: linux bash shell ubuntu

我正在编写一系列Ubuntu安装后脚本,以便安装我需要的库和工具,其中一个应该使用前者安装pyenv和最新的python版本,脚本如下:

#!/usr/bin/env bash

# clone the github repo
echo "Installing pyenv..."
git clone https://github.com/yyuu/pyenv.git ~/.pyenv

# update .bashrc
echo '# pyenv settings:' >> ~/.bashrc
echo 'export PYENV_ROOT="~/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'export PATH="~/.pyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

# reload
. ~/.bashrc

# install python and virtualenv
echo "Installing python 3.5.1 + virtualenv..."
pyenv install 3.5.1
pyenv global 3.5.1
pip install --upgrade pip
pip install virtualenv
echo "pyenv has been installed with python 3.5.1 and virtualenv"

问题是重新加载(. ~/.bashrc)似乎没有按预期工作,因为我得到:

python.sh: pyenv: not found
python.sh: pip: not found

我也试过source ~/.bashrcexec $SHELL,但问题仍然存在。

我该如何解决这个问题?

ps:我用sudo sh python.sh

执行脚本

2 个答案:

答案 0 :(得分:1)

如果引用~,则不会扩展到用户的主目录。请改用它。

echo '# pyenv settings:' >> ~/.bashrc
echo 'export PYENV_ROOT=~/.pyenv' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'export PATH=~/.pyenv/bin:"$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

我也会改写它看起来像这样:

cat <<'EOF' >> ~/.bashrc
# pyenv settings:
export PYENV_ROOT=~/.pyenv
export PATH=$PYENV_ROOT/bin:$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
EOF

但是,您不应该使用用户的.bashrc文件;你不知道那里还有什么,你不需要执行整个过程,只需要执行其余脚本所需的部分。将. ~/.bashrc替换为

export PYENV_ROOT=~/.pyenv
export PATH=$PYENV_ROOT/bin:$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"

答案 1 :(得分:0)

操纵~/.bashrc很危险,除非你想要永久性的东西,否则你也不需要。

更改

echo 'export PYENV_ROOT="~/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'export PATH="~/.pyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

export PYENV_ROOT="~/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
export PATH="~/.pyenv/bin:$PATH"
eval "$(pyenv init -)"

并且脚本的其余部分将使用修改后的变量,甚至是子壳。

修改

要永久性地将其写入~/.pyenvrc,只需通过附加修改~/.bashrc

source ~/.pyenvrc