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

OSX: 这是从命令行工作的:

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

但是在 shell 脚本中,它没有任何效果。我想写一个脚本,将在 Ruby 1.8和 Ruby 1.9之间切换,所以这需要一个脚本-不在我的配置文件。

看起来“ source script.sh”可以工作,但是“ ./script.sh”。为什么会这样? 我如何在我的脚本中复制它?

63280 次浏览

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

使用 . ./script.shsource ./script.sh来源文件将在当前 shell 上下文中读取和执行来自文件名参数的命令,也就是说,当脚本使用 source运行时,它在现有的 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

来回切换。

对于您来说,简单的答案是脚本创建非交互式 shell,并且默认情况下,expal _ aliases 选项通常是禁用的。

您可以通过在脚本顶部添加以下代码行来启用别名扩展,从而非常简单地解决这个问题:

Shopt-s 扩展 _ 别名

这个问题一直困扰着我,所以我做了研究,然后写了一篇博客文章,一旦我知道如何自己解决它: 发布关于在 Linux shell 脚本中使用别名的文章。

当然,在我解决了这个问题之后,我发现,虽然它可以满足您的需要,但是如果您在子 shell 中包含一个子 shell,那么它就不能工作。我仍然在寻找解决这个问题的方法,这就是为什么我刚才遇到了你的问题。在博客文章中,我提到了一个廉价的黑客技术,我用它来获取 shell 脚本中的别名。它并不优雅,但它实际上甚至在我遇到的这个多子 shell 问题中也能工作。

如果需要切换 Ruby 版本,请尝试 Rvm