【问题标题】:How do I run Unix commands using system and backticks?如何使用系统和反引号运行 Unix 命令?
【发布时间】:2013-10-07 00:30:49
【问题描述】:

这行得通:

system("ruby #{File.dirname(__FILE__) + '/Test')}")

但是这个

`ruby #{File.dirname(__FILE__) + '/Test'}`

不运行脚本测试

还有这个:

system("ruby #{File.dirname(__FILE__) + '/Test #{arg}'")

不采用 arg 值。

我做错了什么?

【问题讨论】:

  • 在您使用的 shell 中,反引号是什么意思。你没有指出外壳。 (第二行)。变量“arg”的值是多少?
  • ruby-doc.org/core-2.0.0/Kernel.html#method-i-60。我正在尝试通过 ruby​​ 文件运行 unix 命令。 arg 是我将通过命令行传递的一个词。 system("echo #{arg}") 给出了正确的 arg 值。
  • 为清楚起见并减少出错的可能性,请将路径分配给变量,然后使用该变量在字符串中进行插值。不要在插值中进行计算;这太疯狂了。
  • 你说“行不通”对我们没有好处。您必须具体,否则,对于您提出的每一个模棱两可的问题,我们的答案都必须不那么具体,否则我们不得不浪费时间试图弄清楚到底发生了什么。

标签: ruby linux unix system command-line-arguments


【解决方案1】:

第二个不起作用,因为有一个不平衡的尾随双引号 (") 和右括号 ()),这可能会引发错误,但您没有看到它,因为反引号忽略标准错误:

`ruby #{File.dirname(__FILE__) + '/Test'")}`

第三个不起作用,因为您试图将变量插入到用单引号括起来的固定字符串中,这也缺少终止 }

system("ruby #{File.dirname(__FILE__) + '/Test #{arg}'")

如果您没有在字符串插值中嵌入字符串计算,您会发现这一点很突出:

cmd_file = File.dirname(__FILE__) + '/Test #{arg}'
system("ruby #{ cmd_file }")

修复引用并使用内在 File.join 以确保正确性:

cmd_file = File.join(File.dirname(__FILE__), "Test #{arg}")
system("ruby #{ cmd_file }")

【讨论】:

    猜你喜欢
    • 2019-01-25
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2014-12-07
    • 1970-01-01
    相关资源
    最近更新 更多