无法shell脚本的内部时,命令执行
问题描述:
所以今天晚上的大部分时间通过RVM永久影响Linux环境中活跃的Ruby版本,我一直在努力用bash脚本我写,以帮助简化/自动化/引导(无论你想调用它)我的开发环境,从头开始创建一个新的Rails项目。无法shell脚本的内部时,命令执行
我正在模块化编写脚本,即编写完全自己的脚本,这些脚本独立于较大的整体脚本运行,然后将其整合到脚本流程中。
我与之战斗的当前scriptlet与交互式更改活动Ruby版本有关,如果您想要安装的版本已经存在,并且如果您想要的版本不存在,它将安装并设置为活动版本。
这主要是一个增强整个过程,而不是在所有的脚本本身重要,但一个非常大的“锦上添花”,
至于是什么,我在准备写作已经完成此功能:
- 设置我的终端接受壳登录(Linux Mint的17.1)
- 添加源$ HOME/.rvm /脚本/ RVM使RVM为脚本中的函数运行
首先,我将粘贴代码测试的输出日志,然后粘贴脚本代码本身。注意:$ crver只是我创建的一个环境变量,它指向可执行脚本以节省输入时间。
安装Ruby的新版本:
[email protected] ~ $ $crver
rvm rubies
=* ruby-2.2.2 [ x86_64 ]
# => - current
# =* - current && default
# * - default
Is the version of Ruby you wish to use listed above? (Y/N) n
Enter the Ruby version to install (ex: 2.2.2), followed by [ENTER]: 2.2.1
Searching for binary rubies, this might take some time.
No binary rubies available for: mint/17.1/x86_64/ruby-2.2.1.
Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies.
Checking requirements for mint.
Requirements installation successful.
Installing Ruby from source to: /home/gabrial/.rvm/rubies/ruby-2.2.1, this may take a while depending on your cpu(s)...
ruby-2.2.1 - #downloading ruby-2.2.1, this may take a while depending on your connection...
ruby-2.2.1 - #extracting ruby-2.2.1 to /home/gabrial/.rvm/src/ruby-2.2.1....
ruby-2.2.1 - #applying patch /home/gabrial/.rvm/patches/ruby/2.2.1/fix_installing_bundled_gems.patch.
ruby-2.2.1 - #configuring.........................................................
ruby-2.2.1 - #post-configuration..
ruby-2.2.1 - #compiling...............................................................................
ruby-2.2.1 - #installing.............................
ruby-2.2.1 - #making binaries executable..
ruby-2.2.1 - #downloading rubygems-2.4.6
ruby-2.2.1 - #extracting rubygems-2.4.6.....
ruby-2.2.1 - #removing old rubygems.........
ruby-2.2.1 - #installing rubygems-2.4.6.....................
ruby-2.2.1 - #gemset created /home/gabrial/.rvm/gems/[email protected]
ruby-2.2.1 - #importing gemset /home/gabrial/.rvm/gemsets/global.gems...............................................
ruby-2.2.1 - #generating global wrappers........
ruby-2.2.1 - #gemset created /home/gabrial/.rvm/gems/ruby-2.2.1
ruby-2.2.1 - #importing gemsetfile /home/gabrial/.rvm/gemsets/default.gems evaluated to empty gem list
ruby-2.2.1 - #generating default wrappers........
ruby-2.2.1 - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
Install of ruby-2.2.1 - #complete
Ruby was built without documentation, to build it run: rvm docs generate-ri
Using /home/gabrial/.rvm/gems/ruby-2.2.1
[email protected] ~ $ rvm list
rvm rubies
ruby-2.2.1 [ x86_64 ]
=* ruby-2.2.2 [ x86_64 ]
# => - current
# =* - current && default
# * - default
使用Ruby的预先存在的版本,并将其设置为活动:
[email protected] ~ $ $crver
rvm rubies
ruby-2.2.1 [ x86_64 ]
=* ruby-2.2.2 [ x86_64 ]
# => - current
# =* - current && default
# * - default
Is the version of Ruby you wish to use listed above? (Y/N) y
Enter the Ruby version to use (ex: 2.2.2), followed by [ENTER]: 2.2.1
Using /home/gabrial/.rvm/gems/ruby-2.2.1
[email protected] ~ $ rvm list
rvm rubies
ruby-2.2.1 [ x86_64 ]
=* ruby-2.2.2 [ x86_64 ]
# => - current
# =* - current && default
# * - default
正如你所看到的,在脚本它验证它将Ruby的版本设置为2.2.1,但在实际环境中,它仍然为2.2.2
奇怪的是,我也尝试使用rvm use $rubyver --default
取得部分成功。当直接在命令行中运行的rvm list
,它显示了默认版本预期的符号,但红宝石的活动版本保持不变:
[email protected] ~ $ $crver
rvm rubies
ruby-2.2.1 [ x86_64 ]
=* ruby-2.2.2 [ x86_64 ]
# => - current
# =* - current && default
# * - default
Is the version of Ruby you wish to use listed above? (Y/N) y
Enter the Ruby version to use (ex: 2.2.2), followed by [ENTER]: 2.2.1
Using /home/gabrial/.rvm/gems/ruby-2.2.1
[email protected] ~ $ rvm list
rvm rubies
* ruby-2.2.1 [ x86_64 ]
=> ruby-2.2.2 [ x86_64 ]
# => - current
# =* - current && default
# * - default
下面是脚本本身的代码块:
#!/bin/bash
source $HOME/.rvm/scripts/rvm
rvmexec() {
msg="Enter the Ruby version to $1 (ex: 2.2.2), followed by [ENTER]: "
case $1 in
[use]*)
read -p "$msg" rubyver
eval rvm use $rubyver
unset rubyver;
break;;
[install]*)
read -p "$msg" rubyver
eval rvm install $rubyver && rvm use $rubyver
unset rubyver;
break;;
esac
}
rvm list
while true; do
read -p "Is the version of Ruby you wish to use listed above? (Y/N) " rubyverexist
case $rubyverexist in
[Yy]*) rvmexec use; break;;
[Nn]*) rvmexec install; break;;
*) echo -e "\nERROR: Please enter a valid response\n";;
esac
done
任何帮助,将不胜感激,请原谅我提前如果我留下什么东西出来的关键,这是上午01时13分和下班6点:)
干杯!
答
好了,一套新的眼睛和谷歌搜索后,它变成了所有我所要做的就是与source
前言VAR(也就是现在的别名),然后脚本的行为与预期:
From ~/.profile:
alias crver="source $HOME/workspace/crver.sh"
--- Output Begins ---
[email protected] ~ $ rvm list
rvm rubies
ruby-2.2.1 [ x86_64 ]
=* ruby-2.2.2 [ x86_64 ]
# => - current
# =* - current && default
# * - default
[email protected] ~ $ crver
rvm rubies
ruby-2.2.1 [ x86_64 ]
=* ruby-2.2.2 [ x86_64 ]
# => - current
# =* - current && default
# * - default
Is the version of Ruby you wish to use listed above? (Y/N) y
Enter the Ruby version to use (ex: 2.2.2), followed by [ENTER]: 2.2.1
Using /home/gabrial/.rvm/gems/ruby-2.2.1
[email protected] ~ $ rvm list
rvm rubies
=* ruby-2.2.1 [ x86_64 ]
ruby-2.2.2 [ x86_64 ]
# => - current
# =* - current && default
# * - default
耶!
〜翅
有大量的信息通过这里来看看,我没有时间去仔细阅读这一切,但只给定标题和介绍我要去猜测,问题是,你是期待对环境变量/等的更改。由脚本完成(通过'eval'和'rvm')来影响运行脚本的运行shell的环境。这是不可能的。这不是如何工作。这就是为什么像'rvm'这样的东西输出环境变量为字符串,并告诉你'eval'他们做出这些变化。如果需要,也可以从脚本中完成。 –