如何从 Ruby 程序内部调用 shell 命令?然后如何将这些命令的输出返回到 Ruby 中?
最佳答案
此解释基于评论Ruby script来 self 的一个 friend 。如果您想改进脚本,请随时在链接上更新它。
首先,请注意,当 Ruby 调用 shell 时,它通常会调用 /bin/sh
,不是 Bash。 /bin/sh
不支持某些 Bash 语法在所有系统上。
以下是执行 shell 脚本的方法:
cmd = "echo 'hi'" # Sample string that can be used
Kernel#`
, 通常称为反引号 –`cmd`
这与许多其他语言一样,包括 Bash、PHP 和 Perl。
返回 shell 命令的结果(即标准输出)。
文档:http://ruby-doc.org/core/Kernel.html#method-i-60
value = `echo 'hi'` value = `#{cmd}`
内置语法,
%x( cmd )
在
x
之后character 是分隔符,可以是任意字符。 如果分隔符是字符之一(
,[
,{
, 或<
, 文字由匹配的结束定界符之前的字符组成, 考虑到嵌套的定界符对。对于所有其他定界符, 文字包含直到下一次出现的字符 分隔符。字符串插值#{ ... }
是允许的。返回 shell 命令的结果(即标准输出),就像反引号一样。
文档:https://docs.ruby-lang.org/en/master/syntax/literals_rdoc.html#label-Percent+Strings
value = %x( echo 'hi' ) value = %x[ #{cmd} ]
Kernel#system
在子 shell 中执行给定的命令。
返回
true
如果找到命令并成功运行,false
否则。文档:http://ruby-doc.org/core/Kernel.html#method-i-system
wasGood = system( "echo 'hi'" ) wasGood = system( cmd )
Kernel#exec
通过运行给定的外部命令替换当前进程。
不返回,当前进程被替换并且不再继续。
文档:http://ruby-doc.org/core/Kernel.html#method-i-exec
exec( "echo 'hi'" ) exec( cmd ) # Note: this will never be reached because of the line above
这里有一些额外的建议:
$?
,与 $CHILD_STATUS
相同, 如果使用反引号 system()
,则访问上次系统执行命令的状态或 %x{}
.
然后您可以访问 exitstatus
和 pid
属性:
$?.exitstatus
更多阅读请看:
关于ruby - 如何从 Ruby 调用 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2232/