如何在bash shell脚本中设置别名,以便从外部可见?
OSX:这从命令行工作:
alias ruby="/opt/local/bin/ruby1.9"
但在一个shell脚本中,它没有任何作用。 我想写一个脚本,将在ruby 1.8和ruby 1.9之间切换,所以这需要一个脚本 – 不是在我的configuration文件。
它出现“source script.sh”的作品,但“./script.sh”。 为什么是这样? 我怎样才能在我的脚本中复制这个?
./script.sh
将在子shell中执行,并且所做的更改仅适用于子shell。 一旦命令终止,子shell就会执行更改。
使用源文件. ./script.sh
. ./script.sh
或source ./script.sh
将从当前shell上下文中的file-name参数中读取和执行命令,也就是说,脚本使用在现有shell中运行的source
运行时,任何创build或修改的variables脚本完成后脚本将保持可用。
最简单的答案就是脚本创build非交互式shell,并且默认情况下,expand_aliases选项通常是禁用的。
只需在脚本的顶部添加以下行来启用别名扩展,即可解决这个问题:
shopt -s expand_aliases
这个问题一直困扰着我,所以我做了研究,然后写了一篇博客文章,我想了解如何为自己修复它: 从Linux shell脚本内部使用别名。
当然,在我弄清楚这一部分之后,我发现,虽然它适用于你所需要的,但是如果你在子shell中有一个子shell,它将不起作用。 我仍然在研究这个问题的解决方法,那就是我刚刚遇到你的问题。 在博客文章中,我提到了一个廉价的黑客,我用它来获取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
来回切换。
如果您需要切换Ruby版本,请尝试rvm 。