如何从Ruby程序内部调用shell命令?然后如何将这些命令的输出返回到Ruby中
这个解释基于我的一个朋友的一个注释过的Ruby脚本。如果您想改进脚本,请随时在链接处进行更新
首先,请注意,当Ruby调用shell时,它通常调用/bin/sh
,而不是Bash。并非所有系统上的/bin/sh
都支持某些Bash语法
以下是执行shell脚本的方法:
cmd=“echo'hi'”可以使用的示例字符串
-
Kernel#`
,通常称为backticks–`cmd`
这与许多其他语言一样,包括Bash、PHP和Perl
返回shell命令的结果(即标准输出)
文件:http://ruby-doc.org/core/Kernel.html#method-i-60
value='echo'hi'` 值=`#{cmd}`
-
内置语法,
%x(cmd)
x
字符后面是分隔符,可以是任何字符。
如果分隔符是字符(
、[
、{
或<lt;
)之一,
文字由字符组成,直到匹配的结束分隔符,
考虑嵌套分隔符对。对于所有其他分隔符
文字包含直到下一次出现的字符
分隔符字符。允许字符串插值#{…}
返回shell命令的结果(即标准输出),就像backticks一样
文件:https://docs.ruby-lang.org/en/master/syntax/literals_rdoc.html#label-百分比+字符串
值=%x(回显'hi') 值=%x[#{cmd}]
-
内核#系统
在子shell中执行给定的命令
如果找到并成功运行该命令,则返回
true
,否则返回false
文件:http://ruby-doc.org/core/Kernel.html#method-i-系统
wasGood=system(“echo'hi'”) wasGood=系统(cmd)
-
Kernel#exec
通过运行给定的外部命令替换当前进程
返回none,当前进程将被替换,并且永远不会继续
文件:http://ruby-doc.org/core/Kernel.html#method-i-exec
exec(“echo'hi'”) exec(cmd)#注意:由于上面的行,将永远无法达到此目标
这里有一些额外的建议:
$?
与$CHILD\u STATUS
相同,如果使用反勾号,system()
或%x{}
,则访问上次系统执行命令的状态。
然后,您可以访问exitstatus
和pid
属性:
$?.exitstatus
欲了解更多信息,请参阅:
- http://www.elctech.com/blog/i-m-in-ur-commandline-executin-ma-commands
- http://blog.jayfields.com/2006/06/ruby-kernel-system-exec-and-x.html
- http://tech.natemurray.com/2007/03/ruby-shell-commands.html