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问题.
cod*_*ict 73
./script.sh
将在子shell中执行,并且所做的更改仅适用于子shell.一旦命令终止,子shell就会进行更改.
使用. ./script.sh
或source ./script.sh
将从当前shell上下文中的file-name参数读取和执行命令来获取文件,也就是说,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
}
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)
来回切换.