我运行以下shell命令:
nvim +CheckHealth +'w ~/Desktop/file.txt' +qall
这会调用nvim
(Neovim)并告诉它连续运行三个命令:
CheckHealth
验证常见错误。它在缓冲区中运行。w ~/Desktop/file.txt
将相同的缓冲区保存到文件中。qall
关闭所有缓冲区。我正在尝试使用system
从ruby运行它。如果我将它作为单个参数运行,它可以正常工作:
system("nvim +CheckHealth +'w ~/Desktop/file.txt' +qall")
但是,如果作为多个参数运行,它会失败(它会运行但不会输出文件):
system("nvim", "+CheckHealth", "+'w ~/Desktop/file.txt'", "+qall")
我做错了什么?注意我不是要求解决方法。我有一个解决方法,即将其作为单个参数运行。我的问题是为什么在以多个参数运行时不起作用?我对system
误解了什么?
答案 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解析其参数列表时,它会看到三个如下所示的参数:
+CheckHealth
+w ~/Desktop/file.txt
+qall
在system
的多参数版本中:
system("nvim", "+CheckHealth", "+'w ~/Desktop/file.txt'", "+qall")
没有shell会启动(这是一件好事,因为你不必担心shell命令注入和转义)所以+w
参数中的单引号不会被删除贝壳。这意味着vim会看到这些论点:
+CheckHealth
+'w ~/Desktop/file.txt'
+qall
据推测,vim对第二个参数中的单引号并不满意。
执行摘要:
system
的单个参数版本使用shell来解析命令行,多参数版本根本不使用shell。
+'w ~/Desktop/file.txt'
中的单引号是为了防止shell将其视为两个参数,它们并不适用于vim。
如果您正在使用system
的多参数版本(您应该这样做),那么您可以说:
system("nvim", "+CheckHealth", "+w ~/Desktop/file.txt", "+qall")
并且不必担心引用和逃避通过shell的事情。