从Ruby调用shell命令
如何从Ruby程序内部调用shell命令? 那我如何从这些命令的输出回到Ruby?
这个解释基于来自我的一位朋友的评论Ruby脚本。 如果您想改进脚本,请随时在链接中更新它。
首先,请注意,当Ruby调出一个shell时,它通常会调用/bin/sh而不是Bash。 在所有系统上,某些Bash语法不受/bin/sh支持。
以下是执行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字符之后是一个分隔符,它可以是任何字符。 如果分隔符是其中一个字符( [ , { ,或< ,则文字由直到匹配的结束分隔符的字符组成,并考虑到嵌套分隔符对。对于所有其他分隔符,文字包括字符下一次出现分隔符。字符串插值#{ ... }是允许的。
返回shell命令的结果,就像反引号一样。
文档:http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html
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
更多阅读请参阅:
我喜欢这样做的方式是使用%x文字,这使得在命令中使用引号变得容易(并且易读!),如下所示:
directorylist = %x[find . -name '*test.rb' | sort]
在这种情况下,它将在当前目录下使用所有测试文件填充文件列表,您可以按预期进行处理:
directorylist.each do |filename|
filename.chomp!
# work with file
end
这是一个基于这个答案的流程图。 另请参阅使用script模拟终端。

