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

phi*_*son 60 bash

OSX:这可以从命令行工作:

alias ruby="/opt/local/bin/ruby1.9"
Run Code Online (Sandbox Code Playgroud)

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

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

小智 100

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

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

shopt -s expand_aliases

这个问题一直困扰着我,所以我做了研究,然后写了一篇博客文章,一旦我弄清楚如何为自己修复它: 发布关于在Linux shell脚本中使用别名的帖子.

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

  • 这是一个比接受的答案要好得多的答案.如果你从搜索到这里,这可能是你想要的. (10认同)
  • 即使我不这是OP的意图,它正是我所寻找的!谢谢 (5认同)
  • 只是大声说出来,这是一个完全不同的问题的好答案。匹配的问题是:`为什么别名命令在bash脚本中不起作用,并且它已经在这里:https://askubuntu.com/questions/98782/how-to-run-an-alias-in-a-shell -脚本 (2认同)

cod*_*ict 73

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

使用. ./script.shsource ./script.sh将从当前shell上下文中的file-name参数读取和执行命令来获取文件,也就是说,source在现有shell中运行脚本运行脚本时,脚本创建或修改的任何变量将在脚本完成.

  • 很好,我不知道这个命令`source`,谢谢:) (2认同)

Dav*_*her 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
}
Run Code Online (Sandbox Code Playgroud)

然后运行你可以运行:

toggle-ruby 1.9
Run Code Online (Sandbox Code Playgroud)

要么

toggle-ruby 1.8
Run Code Online (Sandbox Code Playgroud)

来回切换.


小智 7

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