苹果电脑操作系统(OSX):这个可以在命令行中使用:
alias ruby="/opt/local/bin/ruby1.9"
但是在shell脚本中,它没有效果。我想编写一个脚本,可以在Ruby 1.8和Ruby 1.9之间切换,因此这需要是一个脚本 - 而不是在我的个人资料中。
看起来“source script.sh”可以工作,但是“./script.sh”无法工作。为什么会这样?我如何在我的脚本中复制这个操作?
苹果电脑操作系统(OSX):这个可以在命令行中使用:
alias ruby="/opt/local/bin/ruby1.9"
但是在shell脚本中,它没有效果。我想编写一个脚本,可以在Ruby 1.8和Ruby 1.9之间切换,因此这需要是一个脚本 - 而不是在我的个人资料中。
看起来“source script.sh”可以工作,但是“./script.sh”无法工作。为什么会这样?我如何在我的脚本中复制这个操作?
这个问题一直困扰着我,所以我进行了研究,并在弄清楚如何为自己修复它后写了一篇博客文章: 关于在Linux shell脚本中使用别名的文章。 当然,在我找到解决你的需要的方法之后,我发现,如果你有一个嵌套的子shell,它将无法工作。 我仍在寻找解决这个问题的方法,这就是我遇到你的问题的原因。 在博客文章中,我提到了一个简单的技巧,用于在shell脚本中获取别名。 它不太优雅,但即使在我遇到的这个多次嵌套的问题中,它实际上也能正常运行。shopt -s expand_aliases
./script.sh
将在一个子shell中执行,所做的更改仅适用于子shell。一旦命令终止,子shell也会消失,因此更改也随之消失。
使用. ./script.sh
或source ./script.sh
来对文件进行源代码处理,将在当前shell上下文中读取并执行文件名称参数中的命令。这意味着当使用source
运行脚本时,它将在现有shell中运行,脚本创建或修改的任何变量将在脚本完成后保持可用。
function toggle-ruby() {
if [ "$1" == "1.9" ]; then
alias ruby=/opt/local/bin/ruby1.9
else
alias ruby=/opt/local/bin/ruby1.8
fi
}
然后你可以运行:
toggle-ruby 1.9
toggle-ruby 1.8
来回切换。
update-alternatives
通常用于其他可执行文件。显然,在OS X中没有:http://apple.stackexchange.com/questions/76704/how-to-set-alternatives-in-10-8 - Ciro Santilli OurBigBook.com