0

我运行以下 shell 命令:

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

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

  1. CheckHealth验证常见错误。它在缓冲区中运行。
  2. w ~/Desktop/file.txt将相同的缓冲区保存到文件中。
  3. qall关闭所有缓冲区。

我正在尝试从 ruby​​ 运行它,使用system. 如果我将它作为单个参数运行,它可以正常工作:

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

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

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

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

4

1 回答 1

1

当您使用单参数版本时system

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

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

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

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

  1. +CheckHealth
  2. +w ~/Desktop/file.txt
  3. +qall

在 的多参数版本中system

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

不会启动任何外壳(这是一件好事,因为您不必担心外壳命令注入和转义),因此+w外壳不会删除参数中的单引号。这意味着 vim 看到这些参数:

  1. +CheckHealth
  2. +'w ~/Desktop/file.txt'
  3. +qall

大概 vim 对第二个参数中的单引号不满意。

执行摘要:

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

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

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

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

    并且不必担心引用和转义东西以通过外壳。

于 2016-12-26T19:23:11.447 回答