为什么 vagrant provisioner 不修改 ~/.bashrc?

why doesn't vagrant provisioner modify ~/.bashrc?

如何让 Vagrantfile 将文件的内容附加到 ~/.bashrc 文件?

在我的 Vagrantfile 中,我试图将文件 /vagrant/dev_env_config 的内容附加到 ~/.bashrc 文件。

当我 运行 vagrant up 它输出 echo 语句并输出 ~/.bashrc 文件的预期内容....所以我知道它正在读取文件 dev_env_config 并且似乎要附加它。

但是,当我然后 运行 vagrant ssh 然后 cat ~/.bashrc ~/.bashrc 文件未修改时,它是默认的 ~/.bashrc 文件

换句话说,~/.bashrc 文件的模组在 vagrant provison 运行s 和我 运行 vagrant ssh

之间的某个地方丢失了
# Vagrantfile

Vagrant.configure("2") do |config|
  ... various cmds to set box and network...
  $install_user_vars = <<SCRIPT
      sudo cat /vagrant/dev_env_config  >> ~/.bashrc
      echo "*** here is the .bashrc file:"
      cat ~/.bashrc
SCRIPT
  config.vm.provision "shell", inline: $install_user_vars
end

我认为发生的事情是供应脚本 运行 作为 root(或 sudo),所以“~”主位置实际上是 /root 而不是默认用户主位置 /home/vagrant。

我能想到几个方法来解决这个问题:

首先(可能也是最简单的)是明确 .bashrc 路径,例如:

# Vagrantfile

Vagrant.configure("2") do |config|
  ... various cmds to set box and network...
  $install_user_vars = <<SCRIPT
      sudo cat /vagrant/dev_env_config  >> /home/vagrant/.bashrc
      echo "*** here is the .bashrc file:"
      cat /home/vagrant/.bashrc
SCRIPT
  config.vm.provision "shell", inline: $install_user_vars
end

第二个选项可以是运行作为非特权用户的这部分供应脚本。请参阅 Shell Scripts 文档页面上的 'privileged' 选项。

一个原始的解决方案是明确地将路径设置为.bashrc。作为规则,SSH 用户的默认用户名(将用于 vagrant ssh 操作)是 vagrant 所以:

$install_user_vars = <<SCRIPT
      sudo cat /vagrant/dev_env_config  >> /home/vagrant/.bashrc
      echo "*** here is the .bashrc file:"
      cat /home/vagrant/.bashrc
SCRIPT

我也不确定是否有必要使用 sudo 命令(在 sudo cat ... 中)。可能您不需要它,但这取决于哪个用户习惯于 运行 供应脚本。我猜也是 vagrant.

因此,如果它真的是 vagrant,您可以不修改 .bashrc 的路径 (~/.bashrc),但必须删除 sudo cat ... 命令并使用简单的 cat ... 代替。在我看来,这是一个更干净的解决方案。因为实际上我们不应该在不需要的情况下使用 sudo (root) 权限。