如何从Ruby程序内部调用shell命令?然后如何将这些命令的输出返回到Ruby中?
当前回答
给定像attrib这样的命令:
require 'open3'
a="attrib"
Open3.popen3(a) do |stdin, stdout, stderr|
puts stdout.read
end
我发现,虽然这种方法不像
system("thecommand")
or
`thecommand`
在反引号中,与其他方法相比,此方法的一个优点是 反勾号似乎不让我把我运行的命令/存储我想要运行的命令在一个变量中,而system(" command")似乎不让我得到输出,而这个方法让我做这两件事,它让我访问stdin, stdout和stderr独立。
参见“在ruby中执行命令”和ruby的Open3文档。
其他回答
给定像attrib这样的命令:
require 'open3'
a="attrib"
Open3.popen3(a) do |stdin, stdout, stderr|
puts stdout.read
end
我发现,虽然这种方法不像
system("thecommand")
or
`thecommand`
在反引号中,与其他方法相比,此方法的一个优点是 反勾号似乎不让我把我运行的命令/存储我想要运行的命令在一个变量中,而system(" command")似乎不让我得到输出,而这个方法让我做这两件事,它让我访问stdin, stdout和stderr独立。
参见“在ruby中执行命令”和ruby的Open3文档。
这不是一个真正的答案,但也许有人会发现它有用:
在Windows上使用TK GUI时,您需要从rubyw调用shell命令,您总是会有一个烦人的CMD窗口弹出不到一秒钟。
为了避免这种情况,你可以使用:
WIN32OLE.new('Shell.Application').ShellExecute('ipconfig > log.txt','','','open',0)
or
WIN32OLE.new('WScript.Shell').Run('ipconfig > log.txt',0,0)
两者都将ipconfig输出存储在log.txt中,但是不会弹出窗口。
你需要在你的脚本中要求'win32ole'。
system(), exec()和spawn()都会在使用TK和rubyw时弹出恼人的窗口。
我绝对不是Ruby专家,但我还是会试一试:
$ irb
system "echo Hi"
Hi
=> true
你还应该能够做以下事情:
cmd = 'ls'
system(cmd)
不确定shell命令。我使用以下命令将系统命令的输出捕获到变量val中:
val = capture(:stdout) do
system("pwd")
end
puts val
缩短版本:
val = capture(:stdout) { system("pwd") }
捕获方法由active_support/core_ext/kernel/reporting.rb提供
类似地,我们也可以用:stderr捕获标准错误
上面的答案已经非常棒了,但是我真的很想分享下面的总结文章:“在Ruby中运行Shell命令的6种方法”
基本上,它告诉我们:
# exec内核:
exec 'echo "hello $HOSTNAME"'
System和$?:
system 'false'
puts $?
Backticks ():
today = `date`
IO # execlp:
IO.popen("date") { |f| puts f.gets }
Open3#popen3—stdlib:
require "open3"
stdin, stdout, stderr = Open3.popen3('dc')
Open4#popen4—一个宝石:
require "open4"
pid, stdin, stdout, stderr = Open4::popen4 "false" # => [26327, #<IO:0x6dff24>, #<IO:0x6dfee8>, #<IO:0x6dfe84>]
推荐文章
- 如何从查找“类型d”中排除此/ current / dot文件夹
- 只使用md5sum获取哈希值(没有文件名)
- Rails中的OO设计:在哪里放置东西
- 使用sh shell比较字符串
- 在Bash中测试非零长度字符串:[-n "$var"]或["$var"]
- 如何创建Bash别名?
- 如何设置ssh超时时间?
- 给定一个类,查看实例是否有方法(Ruby)
- 将所有变量从一个shell脚本传递到另一个?
- 只列出UNIX中的目录
- 在日历应用程序中建模重复事件的最佳方法是什么?
- 如何删除shell脚本中文件名的扩展名?
- 'find -exec'是Linux中的shell函数
- 如何创建一个私有类方法?
- 临时更改bash中的当前工作目录以运行命令