我正在写一个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 ~/.bashrc
, rbenv
变得定义。
但是,如果我运行完全相同的代码,但将rbenv
source ~/.bashrc
replace为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。 为了更好地了解发生了什么: