Shell 我想移植zsh';鱼壳的功能

Shell 我想移植zsh';鱼壳的功能,shell,command-line,fish,Shell,Command Line,Fish,我有一个关于鱼壳的问题 function agvim ag $argv | peco --query "$LBUFFER" | awk -F : '{print "-c " $2 " " $1}' >> $HOME/.agvim_history vim (tail -n 1 $HOME/.agvim_history) end 我将zsh的函数写为: function agvim() { vim $(ag "$@" | peco --query "$LBUFFER" |

我有一个关于鱼壳的问题

function agvim
  ag $argv | peco --query "$LBUFFER" | awk -F : '{print "-c " $2 " " $1}' >> $HOME/.agvim_history
  vim (tail -n 1 $HOME/.agvim_history)
end
我将zsh的函数写为:

function agvim() {
  vim $(ag "$@" | peco --query "$LBUFFER" | awk -F : '{print "-c " $2 " " $1}')
}
它起作用了

但是我刚刚移植了这个函数,它不能正常工作,这个函数是从zsh移植到fishshell的

function agvim
  ag $argv | peco --query "$LBUFFER" | awk -F : '{print "-c " $2 " " $1}' >> $HOME/.agvim_history
  vim (tail -n 1 $HOME/.agvim_history)
end
但是它不能正常工作。vim命令将以tail的输出作为文件名打开。 因为我认为expand命令替换与zsh有点不同。 这是tail的输出示例
-c3bin/ec
,我想将此输出用作选项

请告诉我更好的解决办法

这是tail的输出示例-c3bin/ec,我想将此输出用作选项

这里遇到的问题是,zsh与bash一样,将在空格上拆分命令替换,而fish只在换行符上拆分

这意味着zsh将向vim发送“-c”、“3”和“bin/ec”,而fish将发送“-c3 bin/ec”作为一个参数


有几种方法可以解决这个问题,其中一种方法是,如果您是从git运行fish,则使用
tail | string split”“
。另一种几乎适用于任何fish版本的方法是使用sed(
tail | sed“s/\n/g”
)。

如果您信任输入,则可以在这里使用
eval

function agvim
  eval vim (ag $argv | peco --query "$LBUFFER" | awk -F: '{print "-c",$2,$1}')
end

出于好奇:为什么不直接翻译,而不使用缓存文件?不要-它会破坏任何看起来像fish扩展的东西(任何以$和字母数字字符开头的东西,或以“()”或“{}”开头的东西).虽然该脚本实际上根本不进行任何转义,但通过eval运行它会加剧问题。