将参数从一个函数代理到命令
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 将拆分的空格)
我有函数 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 将拆分的空格)