我运行以下shell命令:
nvim +CheckHealth +'w ~/Desktop/file.txt' +qall这将调用nvim (新维姆),并告诉它连续运行三个命令:
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有什么误解
发布于 2016-12-26 19:23:11
使用system的单个参数版本时
system("nvim +CheckHealth +'w ~/Desktop/file.txt' +qall")你要发射一个壳然后把整个字符串交给它:
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参数中的单引号不会被shell删除。这意味着vim看到了这些论点:
+CheckHealth+'w ~/Desktop/file.txt'+qall据推测,vim对第二个论点中的单引号并不满意。
执行摘要:
system的单个参数版本使用shell来解析命令行,而多参数版本根本不使用shell。+'w ~/Desktop/file.txt'中的单引号是为了防止shell将其作为两个参数来处理,它们不存在于vim中。system的多参数版本(您应该这么做),那么您会说:
系统(“nvim”、"+CheckHealth“、"+w ~/Desktop/file.txt”、"+qall")
不用担心引用和逃避东西就能通过壳。https://stackoverflow.com/questions/41335028
复制相似问题