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

如何在bashshell脚本中设置别名,使其从外部可见?,bash,Bash,OSX:这在命令行中起作用: alias ruby="/opt/local/bin/ruby1.9" 但在shell脚本中,它没有效果。我想写一个在ruby 1.8和ruby 1.9之间切换的脚本,所以这需要是一个脚本,而不是在我的配置文件中 看起来“sourcescript.sh”可以工作,但是“/script.sh”。为什么会这样?如何在脚本中复制此内容?/script.sh将在子shell中执行,所做的更改仅应用于子shell。一旦命令终止,子shell将继续,更改也将继续 使用查找文件

OSX:这在命令行中起作用:

alias ruby="/opt/local/bin/ruby1.9"
但在shell脚本中,它没有效果。我想写一个在ruby 1.8和ruby 1.9之间切换的脚本,所以这需要是一个脚本,而不是在我的配置文件中


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

/script.sh
将在子shell中执行,所做的更改仅应用于子shell。一旦命令终止,子shell将继续,更改也将继续


使用
查找文件/script.sh
source./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


来回切换。

对您来说,简单的答案是脚本创建非交互式Shell,默认情况下,“扩展别名”选项通常被禁用

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

shopt-s扩展_别名

这个问题一直困扰着我,所以我做了研究,然后在我找到了解决方法后写了一篇博文:


当然,在我理解了这一部分之后,我发现,虽然它可以满足您的需要,但如果您在子shell中有子shell,它将不起作用。我仍在研究解决这个问题的方法,这就是我刚才遇到你的问题的原因。在博客文章中,我提到了一个廉价的黑客,我用它在shell脚本中获取别名。它并不优雅,但实际上它甚至在我遇到的多个子shell问题中也能工作。

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

这是一个比公认的更好的答案。如果你是通过搜索登陆这里的,这可能是你想要的。尽管我不知道这是OP的意图,但它正是我要搜索的!谢谢你最好的回答。你应该在bash脚本的顶部添加这个,而不是~/.bash_profile。不能在ubuntu 14.04上使用。我希望脚本更改我的别名。但它只是在脚本运行期间更改别名。只需大声说出明显的问题,这是对完全不同问题的一个很好的回答。匹配的问题是:
为什么alias命令在bash脚本中不起作用
,而且它已经在这里了:在Linux中,一般来说,对于其他可执行文件,
更新替代项
。显然不是在OS X中:
toggle-ruby 1.8