我的函数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
的任何内容都能保持这种状态?
答案 0 :(得分:2)
eval
是导致问题的原因。这只需要它的所有参数并将它们解释为就好像它们是在命令行上给出的,即它再次标记它,执行扩展等等。
如果可以的话,我建议避免使用eval
,在这种情况下(目前)你不能这样做。
您应该使用string escape
来保护您不希望eval
再次解释的任何论据:
eval (string escape -- (type -fP $argv[1]) $args)
(我也在这里转义type -fP
,因为它可能包含eval会拆分的空格)