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

时间:2010-02-04 05:16:43

标签: bash

OSX:这可以从命令行运行:

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

但是在shell脚本中,它没有任何效果。我想写一个将在ruby 1.8和ruby 1.9之间切换的脚本,所以这需要是一个脚本 - 而不是在我的个人资料中。

看起来“source script.sh”有效,但是“./script.sh”。为什么是这样?我怎样才能在我的脚本中复制它?

4 个答案:

答案 0 :(得分:99)

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

只需在脚本顶部添加以下行以启用别名扩展,即可轻松解决此问题:

  

shopt -s expand_aliases

这个问题一直困扰着我,所以我做了研究,然后写了一篇博客文章,一旦我弄清楚如何为自己解决这个问题: Post about using alias from within Linux shell scripts.

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

答案 1 :(得分:71)

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

使用. ./script.shsource ./script.sh获取文件将从当前shell上下文中的file-name参数读取并执行命令,即使用source运行脚本时在现有shell中,脚本完成后,脚本创建或修改的任何变量都将保持可用。

答案 2 :(得分:7)

您可以在.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

来回切换。

答案 3 :(得分:7)

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