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

74

苹果电脑操作系统(OSX):这个可以在命令行中使用:

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

但是在shell脚本中,它没有效果。我想编写一个脚本,可以在Ruby 1.8和Ruby 1.9之间切换,因此这需要是一个脚本 - 而不是在我的个人资料中。

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

4个回答

121
简单来说,脚本创建非交互式shell,默认情况下,expand_aliases选项经常被禁用。
你可以很容易地通过在脚本顶部添加以下行来启用别名扩展来解决这个问题:

shopt -s expand_aliases

这个问题一直困扰着我,所以我进行了研究,并在弄清楚如何为自己修复它后写了一篇博客文章: 关于在Linux shell脚本中使用别名的文章。 当然,在我找到解决你的需要的方法之后,我发现,如果你有一个嵌套的子shell,它将无法工作。 我仍在寻找解决这个问题的方法,这就是我遇到你的问题的原因。 在博客文章中,我提到了一个简单的技巧,用于在shell脚本中获取别名。 它不太优雅,但即使在我遇到的这个多次嵌套的问题中,它实际上也能正常运行。

11
这个答案比被采纳的那个好多了。如果你是通过搜索来到这里,那么这个答案可能是你想要的。 - bahamat
5
虽然我不确定原帖作者的意图,但这正是我正在寻找的!谢谢。 - Filipe Pina
1
无法在Ubuntu 14.04上工作。我想要一个脚本来更改我的别名。但它只会在脚本运行期间更改别名。 - Mithril
1
被接受的答案可行,而这个不行。还有Ubuntu 14.04。 - AlwaysLearning
4
说出显而易见的事实,这是对一个完全不同问题的很好的回答。匹配的问题应该是:“为什么别名命令在bash脚本中不起作用”,它已经在这里了:https://askubuntu.com/questions/98782/how-to-run-an-alias-in-a-shell-script - papo
显示剩余4条评论

86

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

使用. ./script.shsource ./script.sh来对文件进行源代码处理,将在当前shell上下文中读取并执行文件名称参数中的命令。这意味着当使用source运行脚本时,它将在现有shell中运行,脚本创建或修改的任何变量将在脚本完成后保持可用。


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

来回切换。


7
如果需要切换 Ruby 版本,请尝试使用 rvm

在Linux中,update-alternatives通常用于其他可执行文件。显然,在OS X中没有:http://apple.stackexchange.com/questions/76704/how-to-set-alternatives-in-10-8 - Ciro Santilli OurBigBook.com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接