我正在尝试编写一个 bash 脚本来从头到尾安装 rbenv。我出于兴趣而使用 Mac。
但有些事情不起作用,主要是我正在更改目录,但仅在子 shell 中更改。
#!/bin/bash
echo "installing rbenv ruby manager manager"
cd ~
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source .bash_profile
echo "installing ruby build for rbenv"
git clone https://github.com/sstephenson/ruby-build.git
cd ruby-build
sudo ./install.sh
echo "rbenv and ruby-build have been installed, installing ruby now.."
sleep 2
read -p "would you like chronospere to install ruby 1.9.3 [y/n]" RESP
if [ "$RESP" = "y" ]; then
rbenv install 1.9.3-p327
rbenv rehash
rbenv global 1.9.3-p327
ruby -v
else
echo "alrigt skipping.. vagrant has rbenv installed you can install ruby it at your leisure "
echo "hold cmd, and double clck https://github.com/sstephenson/rbenv for more info"
fi
cd ~
所以看来安装它是有效的。但我的大部分代码都没有运行,或者没有在我想要的地方运行。
vagrant@precise64:/vagrant$ ruby -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux]
vagrant@precise64:/vagrant$ rbenv
The program 'rbenv' is currently not installed. You can install it by typing:
sudo apt-get install rbenv
正如您所看到的,就好像什么都没有安装一样。source .bash_profile
从未发生过的事
vagrant@precise64:/vagrant$ cd
vagrant@precise64:~$ cd ~
vagrant@precise64:~$ source .bash_profile
在我手动获取 bash_profile 后,
vagrant@precise64:~$ rbenv
rbenv 0.4.0-45-g060f141
vagrant@precise64:~$ rbenv versions
* system (set by /home/vagrant/.rbenv/version)
1.9.3-p327
vagrant@precise64:~$ rbenv global 1.9.3-p327
vagrant@precise64:~$ ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux]
正如您所看到的,代码似乎正在运行,只是没有从一个目录移动到下一个目录。我什至不知道这是否可以在 bash 脚本中实现。我从~ / (HOME)
到/ruby-build
回到 然后~
到/vagrant
。这可以在单个 bash 脚本中实现吗?这很奇怪,因为如果我打开终端并逐行运行该代码,它可以 100% 工作。
答案1
最直接的原因是@l0b0提到的:你需要更新PATH
你的变量当前的shell,您可以使用source .bash_profile
(或. .bash_profile
) 执行此操作。通过脚本更新 shell 的初始化文件后生成的任何其他 shell 都将“开箱即用”(因为它将使用更新的初始化文件)。
也就是说,除非你迟早会遇到可怕的混乱,否则你可能想要稍微整理一下。我看到的主要问题是:
尽可能使用一些包管理 - 作为 Mac 用户,您可能想要查看相关问题在超级用户 SE 上。不使用包管理通常是一种不好的做法(尽管此规则也有例外)。
能
sudo ...
保证工作吗?鉴于rbenv
您的主目录中有,您真的需要将其安装在根目录下吗?这与上一点有关。虽然
~/.rbenv/bin
可能没问题,但模仿一般效果通常会更好FHS在您自己的目录中(通过直接将bin/
、etc/
等放入lib/
其中或将其放入单独的子目录中)。您可能希望用于
set -e
在出现任何错误时中止脚本(您没有明确检查错误) - 请参阅help set
或man bash
了解更多详细信息。git clone
是这里的第一个候选者 - 如果存储库已经存在,则克隆失败,但脚本默默地接受这一点。>> ~/.bash_profile
可能会污染你的 shell 的 init 文件。虽然可以检查这些行是否已经存在,但仅仅打印一条注释来提醒必须手动添加这些行才能使安装正常工作实际上可能更有用。尤其是当你决定将剧本交给其他人时。