从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
模拟终端。