将参数从一个函数代理到命令

Proxying arguments from one function to a command

我有函数 bajouras.fish 调用另一个函数,比方说 scarabosses:

function bajouras
  scarabosses "someCMD" $argv
end

所以函数 scarabosses 将获得第一个参数 "someCMD" 和任何传递给 bajouras.

的额外参数

内部 scarabosses 我正在做这样的事情:

function scarabosses
  if test "$count" -ge 2
    set args $argv[2..-1]
  else
    set args ""
  end

  eval (type -fP $argv[1]) $args
end

现在的问题是,如果我将一些字符串传递给 bajouras

bajouras -v -t "some cool (string)"

并回显 $argv 我的字符串虽然是一个参数,但不再是一个字符串。因此,当我将其传递给 scarabosses 时,我得到的是:

someCMD -v -t some cool (string)

并且由于我不再将字符串传递给 scarabosses fish 将尝试执行一些命令替换,我将收到错误消息。

有没有办法确保我传递给 bajouras 的任何内容都保持原样?

eval 是您遇到问题的原因。这只是接受它的所有参数并将它们解释为好像它们是在命令行上给出的,即它再次对其进行标记化,执行扩展等

我建议尽可能避免 eval,但在这种情况下(目前)您不能这样做。

您在这里应该做的是使用 string escape 来保护您不希望 eval 再次解释的任何参数:

   eval (string escape -- (type -fP $argv[1]) $args)

(我也在此处转义 type -fP,因为它可能包含 eval 将拆分的空格)