【发布时间】:2010-02-04 05:16:43
【问题描述】:
OSX:这可以从命令行运行:
alias ruby="/opt/local/bin/ruby1.9"
但在 shell 脚本中,它没有任何作用。我想编写一个在 ruby 1.8 和 ruby 1.9 之间切换的脚本,所以这需要是一个脚本 - 不在我的个人资料中。
似乎“source script.sh”有效,但“./script.sh”。为什么是这样?如何在我的脚本中复制它?
【问题讨论】:
标签: bash
OSX:这可以从命令行运行:
alias ruby="/opt/local/bin/ruby1.9"
但在 shell 脚本中,它没有任何作用。我想编写一个在 ruby 1.8 和 ruby 1.9 之间切换的脚本,所以这需要是一个脚本 - 不在我的个人资料中。
似乎“source script.sh”有效,但“./script.sh”。为什么是这样?如何在我的脚本中复制它?
【问题讨论】:
标签: bash
对您来说简单的答案是脚本创建非交互式 shell,默认情况下,expand_aliases 选项通常被禁用。
您可以非常简单地解决这个问题,只需在脚本顶部添加以下行以启用别名扩展:
shopt -s expand_aliases
这个问题一直困扰着我,所以我做了研究,然后在我弄清楚如何为自己解决它之后写了一篇博客文章: Post about using alias from within Linux shell scripts.
当然,在我弄清楚那部分之后,我发现虽然它可以满足您的需求,但如果您在子shell中有一个子shell,它就不起作用。我仍在寻找解决该问题的方法,这就是我刚刚遇到您的问题的方式。在博客文章中,我提到了一个廉价的黑客,我用它来获取 shell 脚本中的别名。它并不优雅,但即使在我遇到的这个多子外壳问题中它也确实有效。
【讨论】:
Why is the alias command not working inside a bash script,它已经在这里了:askubuntu.com/questions/98782/…
./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
或
toggle-ruby 1.8
来回切换。
【讨论】:
如果您需要切换 Ruby 版本,请尝试rvm。
【讨论】:
update-alternatives 一般用于其他可执行文件。显然不在 OS X 中:apple.stackexchange.com/questions/76704/…