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

时间:2017-07-21 12:26:24

标签: fish

我的函数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,鱼会尝试进行一些命令替换,我会收到错误。

有没有办法确保传递给bajouras的任何内容都能保持这种状态?

1 个答案:

答案 0 :(得分:2)

eval是导致问题的原因。这只需要它的所有参数并将它们解释为就好像它们是在命令行上给出的,即它再次标记它,执行扩展等等。

如果可以的话,我建议避免使用eval,在这种情况下(目前)你不能这样做。

您应该使用string escape来保护您不希望eval再次解释的任何论据:

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

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