Fish shell 使用来自另一个 exe 的 eval 输出创建函数

Fish shell creating functions using eval'd output from another exe

在带有 fish 2.3.1 的 Ubuntu 服务器 16.10 x64 上,我的 uru_rt exe 在 stdout

上生成此函数
function uru
  set -x URU_INVOKER fish

  # uru_rt must already be on PATH
  uru_rt $argv

  if test -d "$URU_HOME" -a -f "$URU_HOME/uru_lackee.fish"
    source "$URU_HOME/uru_lackee.fish"
  else if test -f "$HOME/.uru/uru_lackee.fish"
    source "$HOME/.uru/uru_lackee.fish"
  end
end

当 运行 通过 uru_rt admin installuru功能提供基于golang的跨平台ruby版本管理工具https://bitbucket.org/jonforums/uru

在 bash 系统上,我通过将 eval "$(uru_rt admin install)" 放在启动文件中来注入 uru 函数,以便 uru 出现在 shell 中。

关于鱼,运行宁eval (uru_rt admin install)奖励我这个失败

$ eval (uru_rt admin install)
Missing end to balance this begin
- (line 1): begin; function uru   set -x URU_INVOKER fish    # uru_rt must already be on PATH   uru_rt $argv    if test -d "$URU_HOME" -a -f "$URU_HOME/uru_lackee.fish"     source "$URU_HOME/uru_lackee.fish"   else if test -f "$HOME/.uru/uru_lackee.fish"     source "$HOME/.uru/uru_lackee.fish"   end end
            ^
from sourcing file -
    called on line 60 of file /usr/share/fish/functions/eval.fish

in function “eval”
    called on standard input

source: Error while reading file “-”

我也试过 set u1 (uru_rt admin install); eval "$u1" 结果相同。

正如预期的那样,当我执行 uru_rt admin install > ~/.config/fish/functions/uru.fish 时,uru 函数将持续可用。虽然这是一个选项,但我更喜欢在 ~/.config/fish/config.fish

中使用 eval

作为钓鱼新手,我如何使用类似于 bash 的 eval "$(uru_rt admin install)"eval 将此 uru 函数动态注入到环境中?

Fish 的 eval 是围绕其 source 内置函数的包装函数,当您传递多行时,它的参数拆分似乎有些奇怪(甚至可能是错误)..

但是,在这种情况下,如果您只使用 source,它会更简单、更快并且实际工作,例如 uru_rt admin install | source

假设确实需要调用 uru_rt admin install - 如果它所做的只是将该代码打印到标准输出,而不更改它,您也可以简单地保存函数,例如在 ~/.config/fish/functions/uru.fish.