【发布时间】:2015-11-14 06:49:40
【问题描述】:
我想从 ruby 代码中调用别名,以便测试我以编程方式插入到点文件中的别名。例如,别名如下:
alias something="echo somethingelse"
我在网上搜索并找到了bash的解决方案:
#solution for bash
system %(
source ~/.bash_profile
shopt -s expand_aliases
something
)
但是,这不适用于 zsh。
我尝试使用以下代码(以及其他命令的组合)调用别名,但无济于事。
system %(
exec zsh #this seems to source .zshrc
something #this does not work
)
我希望它也适用于 zsh。我怎样才能让它为 zsh 工作?有人有建议吗?提前致谢!
我还测试了以下内容,但它们不起作用:
system %(
# exec /bin/zsh #this causes the subsequent lines to not run.
source ~/.zshrc #this causes the error lines to be printed
# setopt aliases #don't think it helps
something #trying to invoke this which is already in zshrc
)
错误信息:
- /Users/ytbryan/.zprezto/init.zsh:第 14 行:自动加载:命令不 找到了
- /Users/ytbryan/.zprezto/init.zsh:第 15 行:打印:命令不是 找到了
- /Users/ytbryan/.zshrc:第 42 行:`@':不是有效标识符
【问题讨论】:
-
shopt是内置的 bash,而不是内置的 zsh。在 zsh 中我们使用setopt。尝试用setopt aliases代替shopt -s expand_aliases。 (当然你需要为 zsh 找到合适的 runcom。) -
回复
exec zsh #this seems to source .zshrc:我对此表示怀疑。.zshrc仅用于交互式 shell。我对 Ruby 不是很熟悉,但我真的怀疑system调用会启动一个交互式 shell。只需手动来源.zshrc。 -
我刚刚尝试过,Ruby 系统调用中的
exec zsh并不能像您希望的那样工作。它在您当前的 shell 中执行exec zsh。鉴于此,我认为您可能应该运行zsh -c。请注意,从zsh -c运行时别名可能不起作用,但您可以通过访问关联数组aliases来强制扩展(并执行分词)。例如,在您的system调用中尝试以下命令:zsh -c 'alias foo="echo bar"; ${=aliases[foo]}'(结果为bar)。另一个带参数的例子:zsh -c 'alias foo=echo; ${=aliases[foo]} $@' -- 1 2 3(结果是1 2 3)。 -
只是
source你的点文件。我定义了别名,以便您可以在没有任何先决条件的情况下轻松测试此方法,而不是必须的。例如,只需将alias foo="echo bar"替换为source ~/.zshrc。 -
没问题。我会把它变成一个答案。