您如何从 ruby 代码中为 zsh shell 调用别名?

How do you invoke alias from ruby code for zsh shell?

我想从 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   
  )

错误信息:

一种方法是通过 zsh -c 运行 Zsh 代码。当 zsh -c 运行 时,别名不会扩展,但是内置的 aliases 数组仍然可以访问,因此仍然可以通过手动从数组中检索扩展并手动执行分词来扩展别名。这应该涵盖大多数常见的别名。对于更高级的别名(涉及进程替换、参数扩展、命令替换、算术扩展、大括号扩展、文件名扩展或文件名生成,或者不仅仅是一个简单的命令),可能需要使用 eval(但是使用 eval 时需要非常谨慎,并且当输入来自不受信任的来源,或来自受信任但可能经过调和的来源时,永远不要使用它。

可以嵌入 Ruby system 调用的示例代码:

> zsh -c 'alias foo="print bar"; ${=aliases[foo]}'
bar
> zsh -c 'alias foo=print; ${=aliases[foo]} $@' -- 1 2 3
1 2 3
> zsh -c 'alias foo="print a b c | grep -o a"; ${=aliases[foo]}'  # simple case where naive expansion fails
a b c | grep -o a
> zsh -c 'alias foo="print a b c | grep -o a"; eval "$aliases[foo]"'  # eval comes to rescue, but be extra careful
a

请注意 sourcezsh -c 中有效,因此上面的别名定义可以从任何文件中获取。