在bash脚本中使用'source'命令

我正在写一个bash脚本来尝试在Ubuntu上自动初始化设置,而且我遇到了一个我不明白的问题。 如果我运行下面的代码:

sudo apt-get -y update && sudo apt-get -y upgrade sudo apt-get -y install curl git-core build-essential openssl sqlite3 apache2-prefork-dev mysql-client git clone git://github.com/sstephenson/rbenv.git ~/.rbenv echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo 'eval "$(rbenv init -)"' >> ~/.bashrc source ~/.bashrc git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build rbenv install -v 1.9.3-p392 .... 

那么脚本结束,但大多数命令失败,因为rbenv是未定义的(脚本用rbenv -v完成后testing)。 如果我然后运行source ~/.bashrcrbenv变得定义。

但是,如果我运行完全相同的代码,但将rbenv source ~/.bashrcreplace为source /home/username/.bashrc ,则会定义rbenv ,脚本将完成而不会出现问题。 有人可以解释这种差异吗? 了解何时以及为什么相对path不起作用我怀疑将来会非常有用。

在初始设置期间,您并不需要“$(rbenv init – )”调用。 这部分有助于稍后在交互式环境中使用rbenv,并且在debugging脚本时可能会增加一些不透明性。

尝试在实际的rbenv调用之前添加:

 export PATH="$HOME/.rbenv/bin:$PATH" 

事实上,要在脚本中使用rbenv,只需将其中的一个和垫片目录添加到path即可。

至于“来源”的失败,来源是一种抨击。 如果你假设bash是默认的shell并且使用#!/ bin / sh作为hashbang,那么ubuntu可以对你玩一些技巧(默认为破解IIRC)。

~$HOME应该总是指向相同的path,所以我期望别的东西被遗漏。

可能的问题:

  • 你用sudo运行这个脚本吗? 如果是这样, $HOME可能是root的家。
  • $HOME不是/home/username/ ? 虽然/home/username是您主目录的标准path,但可以通过其他方式进行configuration。 尝试echo $HOME来validation。

为了更好地了解发生了什么:

  • 抛出一条线
    set -ex
    在顶部。 -e使得它在第一次失败时退出,-x使它在执行时打印正在发生的事情。

  • 回声“$(env)”
    在顶部可以打印出环境,或者如果您已经设置了-x或set -ex以上,只需添加即可
    ENV