在Vagrant配置期间更新.bashrc和环境变量

时间:2015-04-10 19:46:42

标签: python shell vagrant virtualenvwrapper

我正在使用Vagrant设置一个包含python,pip,virtualenv,virtualenvwrapper和一些要求的盒子。配置shell脚本将the required lines for virtualenvwrapper添加到.bashrc。它做了一个非常基本的检查,他们还没有,所以它不会与每个条款重复:

if ! grep -Fq "WORKON_HOME" /home/vagrant/.bashrc; then
    echo 'export WORKON_HOME=/home/vagrant/.virtualenvs' >> /home/vagrant/.bashrc
    echo 'export PROJECT_HOME=/home/vagrant/Devel' >> /home/vagrant/.bashrc
    echo 'source /usr/local/bin/virtualenvwrapper.sh' >> /home/vagrant/.bashrc

    source /home/vagrant/.bashrc
fi

似乎工作正常;配置完成后,这些行都在.bashrc,我可以ssh到框中并使用virtualenvwrapper。

但是,virtualenvwrapper在配置期间不起作用。在上面的部分之后,接下来检查pip需求文件并尝试使用virtualenvwrapper进行安装:

if [[ -f /vagrant/requirements.txt ]]; then
    mkvirtualenv 'myvirtualenv' -r /vagrant/requirements.txt
fi

但这会产生:

==> default: /tmp/vagrant-shell: line 50: mkvirtualenv: command not found

如果我尝试从该shell脚本中回显$WORKON_HOME,则不会显示任何内容。

我缺少那些可用的环境变量,所以virtualenvwrapper会运行吗?

更新:进一步尝试......似乎在我的shell脚本中执行source /home/vagrant/.bashrc无效 - 我可以将echo "hello"放在.bashrc文件中,并且在配置期间不输出(但是如果我在登录时运行source /home/vagrant/.bashrc

我也在shell脚本中尝试了su -c "source /home/vagrant/.bashrc" vagrant但是没有什么不同。

更新2:删除了$BASHRC_PATH变量,这使问题混乱。

更新3:another question我得到了source /home/vagrant/.bashrc无法正常工作的答案:.bashrc文件的第一部分阻止了它以这种方式“非交互式”运行时做任何事情。

4 个答案:

答案 0 :(得分:2)

我找到了一个解决方案,但我不知道它是否是最好的。它重复的事情感觉有点不对,但是......

我仍然将这些行附加到.bashrc,这样如果我进入机器,virtualenvwrapper将会起作用。但是,因为在运行脚本期间source /home/vagrant/.bashrc似乎没有效果,所以我必须明确重复这三个命令:

if ! grep -Fq "WORKON_HOME" $BASHRC_PATH; then
    echo 'export WORKON_HOME=$HOME/.virtualenvs' >> $BASHRC_PATH
    echo 'export PROJECT_HOME=$HOME/Devel' >> $BASHRC_PATH
    echo 'source /usr/local/bin/virtualenvwrapper.sh' >> $BASHRC_PATH
fi

WORKON_HOME=/home/vagrant/.virtualenvs
PROJECT_HOME=/home/vagrant/Devel
source /usr/local/bin/virtualenvwrapper.sh

(顺便说一句,我也意识到在流浪汉配置期间$HOME/root,而不是我假设的/home/vagrant。)

答案 1 :(得分:2)

Vagrant脚本配置器将以root身份运行,因此它的主目录(〜)将是/ root。在您的脚本中,如果您定义BASHRC_PATH = / home / vagrant,那么我相信您的步骤将起作用:追加,然后从/home/vagrant/.bashrc采购。

<强>更新

抓住我之前的想法^^,因为已经正确设置了BASHRC_PATH。

作为替代方案,我们可以使用.profile或.bash_profile。这是一个简化的示例,它设置环境变量FOO,使其在配置期间和ssh登录后可用:

Vagrantfile

Vagrant.configure(2) do |config|
  config.vm.box = "hashicorp/precise32"

  $prov_script = <<SCRIPT
if ! grep -q "export FOO" /home/vagrant/.profile; then
  sudo echo "export FOO=bar" >> /home/vagrant/.profile
  echo "before source, FOO=$FOO"
  source /home/vagrant/.profile
  echo "after source, FOO=$FOO"
fi
SCRIPT

  config.vm.provision "shell", inline: $prov_script
end

结果

$ vagrant up
...
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: before source, FOO=
==> default: after source, FOO=bar
$ vagrant ssh -c 'echo $FOO'
bar
$ vagrant ssh -c 'tail -n 1 ~/.profile'
export FOO=bar

答案 2 :(得分:0)

Ubuntu框中的.bashrc不起作用。您必须创建.bash_profile并添加:

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

答案 3 :(得分:0)

正如前面提到的in your other Q,Vagrant在配置期间禁止交互式shell - 显然,仅限于某些盒子(尽管需要引用它)。对我来说,这会影响官方的Ubuntu Trusty和Xenial盒子。

但是,您可以使用sudo -H -u USER_HERE bash -i -c 'YOUR COMMAND HERE'

模拟交互式bash shell

答案取自:https://stackoverflow.com/a/30106828/4186199

在配置Ubuntu / trusty64和xenial64盒时,这对我通过rbenv和Node通过nvm安装Ruby起了作用。

相关问题