OS: Ubuntu 14.04
我是shell编程的新手(我没有时间成为专家,因为这是我不经常设想做的事情),但我需要在脚本中做一些准备Rails应用程序的东西部署。我有以下脚本:
#!/bin/bash
cd ~
sudo ls -l
read -p $'Enter version of Ruby you want to use, ex: 2.1.7\n' rubyv
if [ "$rubyv" = '' ]; then
echo 'You did not enter a Ruby version to use, exiting...'
exit
fi
echo ' You entered '$rubyv
read -rsp $'If this not what you wanted press any key to exit, otherwise, press c to continue\n' -n1 key
if [ "$key" != 'c' ]; then
exit
fi
然后我想通过使用$ rubyv继续使用rvm来安装Ruby,类似于:
rvm install "$rubyv"
对于测试,我尝试输入我创建的目录名,然后将其添加到脚本的末尾:
cd "$rubyv"
但没有任何事情发生。我错过了什么?
看起来cd命令执行正常,但我没有看到它的原因是,当脚本存在时,我返回〜,我开始的目录。我通过在脚本末尾执行ls -l验证我在我所访问的目录中,它确实给了我正确的列表
答案 0 :(得分:3)
每个shell脚本都在自己的环境中运行。这意味着变量$rubyv
仅存在于脚本中。
目录更改只能在脚本内部完成。该脚本启动后,将其环境中的目录更改为HOME
cd ~
。因此,脚本中的所有命令都是从HOME执行的,例如ls -l
(顺便说一句,在您的主目录中执行ls
sudo
很奇怪。)
脚本终止后,变量$rubyv
无效,您回到执行脚本的目录中。
也可以在当前shell中执行脚本而不使用点空间点斜杠创建子shell:
. ./scriptname
在这种情况下,所有命令都将直接在当前shell中执行,因此它将影响当前环境和目录。但是,最好以通常的方式(仅./scriptname
)运行辅助脚本以保护当前环境。