使用带有长字符串的`system` VS多个参数

时间:2016-12-26 18:35:04

标签: ruby neovim

我运行以下shell命令:

nvim +CheckHealth +'w ~/Desktop/file.txt' +qall

这会调用nvimNeovim)并告诉它连续运行三个命令:

  1. CheckHealth验证常见错误。它在缓冲区中运行。
  2. w ~/Desktop/file.txt将相同的缓冲区保存到文件中。
  3. qall关闭所有缓冲区。
  4. 我正在尝试使用system从ruby运行它。如果我将它作为单个参数运行,它可以正常工作:

    system("nvim +CheckHealth +'w ~/Desktop/file.txt' +qall")
    

    但是,如果作为多个参数运行,它会失败(它会运行但不会输出文件):

    system("nvim", "+CheckHealth", "+'w ~/Desktop/file.txt'", "+qall")
    

    我做错了什么?注意我不是要求解决方法。我有一个解决方法,即将其作为单个参数运行。我的问题是为什么在以多个参数运行时不起作用?我对system误解了什么?

1 个答案:

答案 0 :(得分:1)

当您使用system的单个参数版本时:

system("nvim +CheckHealth +'w ~/Desktop/file.txt' +qall")

您正在启动一个shell并将整个字符串交给它:

nvim +CheckHealth +'w ~/Desktop/file.txt' +qall

执行。这意味着该字符串中的所有内容都将由shell解释;特别是,shell将处理+'w ~/Desktop/file.txt'中的单引号,并且当vim解析其参数列表时,它会看到三个如下所示的参数:

  1. +CheckHealth
  2. +w ~/Desktop/file.txt
  3. +qall
  4. system的多参数版本中:

    system("nvim", "+CheckHealth", "+'w ~/Desktop/file.txt'", "+qall")
    

    没有shell会启动(这是一件好事,因为你不必担心shell命令注入和转义)所以+w参数中的单引号不会被删除贝壳。这意味着vim会看到这些论点:

    1. +CheckHealth
    2. +'w ~/Desktop/file.txt'
    3. +qall
    4. 据推测,vim对第二个参数中的单引号并不满意。

      执行摘要:

      • system的单个参数版本使用shell来解析命令行,多参数版本根本不使用shell。

      • +'w ~/Desktop/file.txt'中的单引号是为了防止shell将其视为两个参数,它们并不适用于vim。

      • 如果您正在使用system的多参数版本(您应该这样做),那么您可以说:

        system("nvim", "+CheckHealth", "+w ~/Desktop/file.txt", "+qall")
        

        并且不必担心引用和逃避通过shell的事情。