如何在bash shell脚本中设置别名,以便从外部可见?

OSX:这从命令行工作:

alias ruby="/opt/local/bin/ruby1.9" 

但在一个shell脚本中,它没有任何作用。 我想写一个脚本,将在ruby 1.8和ruby 1.9之间切换,所以这需要一个脚本 – 不是在我的configuration文件。

它出现“source script.sh”的作品,但“./script.sh”。 为什么是这样? 我怎样才能在我的脚本中复制这个?

./script.sh将在子shell中执行,并且所做的更改仅适用于子shell。 一旦命令终止,子shell就会执行更改。

使用源文件. ./script.sh . ./script.shsource ./script.sh将从当前shell上下文中的file-name参数中读取和执行命令,也就是说,脚本使用在现有shell中运行的source运行时,任何创build或修改的variables脚本完成后脚本将保持可用。

最简单的答案就是脚本创build非交互式shell,并且默认情况下,expand_aliases选项通常是禁用的。

只需在脚本的顶部添加以下行来启用别名扩展,即可解决这个问题:

shopt -s expand_aliases

这个问题一直困扰着我,所以我做了研究,然后写了一篇博客文章,我想了解如何为自己修复它: 从Linux shell脚本内部使用别名。

当然,在我弄清楚这一部分之后,我发现,虽然它适用于你所需要的,但是如果你在子shell中有一个子shell,它将不起作用。 我仍然在研究这个问题的解决方法,那就是我刚刚遇到你的问题。 在博客文章中,我提到了一个廉价的黑客,我用它来获取shell脚本中的别名。 这不是优雅的,但它实际上,即使在我有这个多重子问题。

你可以在.profile中写一个函数来切换别名

 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 

来回切换。

如果您需要切换Ruby版本,请尝试rvm 。