【问题标题】:Setting up Shell Script for Vagrant Setup为 Vagrant 设置设置 Shell 脚本
【发布时间】:2014-07-13 12:48:06
【问题描述】:

尝试编写一个 shell 脚本以通过 Vagrant 在 Ubuntu 上设置我的服务器环境,但遇到了脚本意外结束的问题。我在 Vagrant 的配置选项中添加了 shell 脚本的路径。

流浪者:

# Specify our provision script
config.vm.provision "shell", path: "scripts/bootstrap.sh"

我的脚本:

#!/bin/bash

# Install dependencies for Ruby
sudo apt-get update
sudo apt-get install -y git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev software-properties-common

# Setting up rbenv
echo 'Setting up rbenv'
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL

运行后,我希望将存储库克隆到 .rbenv 文件夹中,并将 rbenv 添加到 ~/.bashrc 中的 $PATH 中,同时评估 rbenv init 函数并将其放入 ~/.bashrc。但是,当在 Vagrant 的配置步骤中执行脚本时,我最终得到的脚本只是克隆了 git 存储库,然后在我的脚本中不执行任何其他操作而终止。

输出:

==> default: Processing triggers for libc-bin (2.19-0ubuntu6) ...
==> default: Setting up rbenv
==> default: Cloning into '.rbenv'...

然后脚本终止并且 ~/.bashrc 保持不变。我想知道如何更改我的 shell 脚本,以便它执行我想要的操作(将 rbenv 添加到 ~/.bashrc)。有什么想法吗?

【问题讨论】:

  • 脚本是否在当前用户的上下文中执行?脚本运行时,~ 会不会指向别处?对于调试,将以下内容添加到您的脚本中并捕获其 stderr 输出:PS4='>$LINENO: '; set -xv

标签: shell vagrant


【解决方案1】:

正如 mklement0 所说,该脚本不会以 vagrant 用户身份运行:它以 root 身份运行。

如果您想以vagrant 用户身份运行脚本,您需要privileged: false

config.vm.provision :shell, privileged: false, path: "scripts/bootstrap.sh"

正如 mklement0 所说:使用 set -xv 来调试您的配置脚本。

如果您想以其他用户身份运行,请不要忘记 su user 不会工作:How do I use su to execute the rest of the bash script as that user?

【讨论】:

    【解决方案2】:

    如果你想执行一些像流浪用户这样的脚本,试试这个。

     su vagrant -l -c "echo Hello world"
    

    【讨论】: