代码之家  ›  专栏  ›  技术社区  ›  Olle Härstedt

在Vim中使用系统(“wget”)时获取“E484:无法打开/tmp/foo/a文件”

  •  1
  • Olle Härstedt  · 技术社区  · 10 年前

    我有一个抛出错误的小函数。这是一个函数:

    function! GetPHPInfo(function_name)
      let page = system("wget -q -O - 'php.net/" . a:function_name)
      " let page = system("wget -q -O - 'google.com'")
      return page
    endfunction
    

    当我从php.info中使用wget时,会出现以下错误:

    E484: Can't open file /tmp/vRXHL5q/7
    

    但当我使用google.com上的wget时却不是这样。我想这是因为谷歌是一个比php.net小的页面,因此可以编写。如何更改tmp文件的允许大小?

    1 回复  |  直到 10 年前
        1
  •  1
  •   Ingo Karkat    10 年前

    我认为你的结论是错误的;临时文件的大小没有限制。相反,我认为这是一个逃避问题。由于传递的函数名中存在特殊字符,因此命令行无效,导致命令失败,因此Vim无法捕获其输出。下面是一个演示,它创建了相同的错误(在Windows上):

    :echo system('echo "fo"o"')
    

    解决方案

    你需要使用 shellescape() ,至少对于可以包含特殊字符的函数名:

    let page = system("wget -q -O - " . shellescape('php.net/' . a:function_name))
    

    至少,您需要正确关闭单引号:

    let page = system("wget -q -O - 'php.net/" . a:function_name . "'")
    

    取决于宽大程度 wget 也可能需要额外的URL转义。(没有内置函数。)