首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用长字符串和多个参数使用‘`system`’

用长字符串和多个参数使用‘`system`’
EN

Stack Overflow用户
提问于 2016-12-26 18:35:04
回答 1查看 55关注 0票数 0

我运行以下shell命令:

代码语言:javascript
复制
nvim +CheckHealth +'w ~/Desktop/file.txt' +qall

这将调用nvim (新维姆),并告诉它连续运行三个命令:

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

我正在尝试使用system从ruby运行这个程序。如果我把它作为一个参数运行,它会运行得很好:

代码语言:javascript
复制
system("nvim +CheckHealth +'w ~/Desktop/file.txt' +qall")

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

代码语言:javascript
复制
system("nvim", "+CheckHealth", "+'w ~/Desktop/file.txt'", "+qall")

我做错了什么?注意,,我不是在要求解决办法,。我有一个解决办法,就是把它作为一个单一的参数运行。我的问题是,为什么它在作为多个参数运行时不能工作,?我对system有什么误解

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-26 19:23:11

使用system的单个参数版本时

代码语言:javascript
复制
system("nvim +CheckHealth +'w ~/Desktop/file.txt' +qall")

你要发射一个壳然后把整个字符串交给它:

代码语言:javascript
复制
nvim +CheckHealth +'w ~/Desktop/file.txt' +qall

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

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

system的多参数版本中

代码语言:javascript
复制
system("nvim", "+CheckHealth", "+'w ~/Desktop/file.txt'", "+qall")

不会启动shell (因为您不必担心shell命令的注入和转义),所以+w参数中的单引号不会被shell删除。这意味着vim看到了这些论点:

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

据推测,vim对第二个论点中的单引号并不满意。

执行摘要:

  • system的单个参数版本使用shell来解析命令行,而多参数版本根本不使用shell。
  • +'w ~/Desktop/file.txt'中的单引号是为了防止shell将其作为两个参数来处理,它们不存在于vim中。
  • 如果您使用的是system的多参数版本(您应该这么做),那么您会说: 系统(“nvim”、"+CheckHealth“、"+w ~/Desktop/file.txt”、"+qall") 不用担心引用和逃避东西就能通过壳。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41335028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档