如何从Ruby程序内部调用shell命令?然后如何将这些命令的输出返回到Ruby中?
当前回答
这不是一个真正的答案,但也许有人会发现它有用:
在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)
最简单的方法是:
reboot = `init 6`
puts reboot
我最喜欢的是Open3
require "open3"
Open3.popen3('nroff -man') { |stdin, stdout, stderr| ... }
你也可以使用反勾操作符('),类似于Perl:
directoryListing = `ls /`
puts directoryListing # prints the contents of the root directory
如果你需要简单的东西,很方便。
你想要使用哪种方法取决于你想要完成什么;有关不同方法的更多细节,请查看文档。
我们可以通过多种方式来实现它。
使用Kernel#exec命令执行后什么都没有:
exec('ls ~')
使用反引号或%x
`ls ~`
=> "Applications\nDesktop\nDocuments"
%x(ls ~)
=> "Applications\nDesktop\nDocuments"
使用Kernel#system命令,如果成功返回true,不成功返回false,如果命令执行失败返回nil:
system('ls ~')
=> true
推荐文章
- 如何从查找“类型d”中排除此/ current / dot文件夹
- 只使用md5sum获取哈希值(没有文件名)
- Rails中的OO设计:在哪里放置东西
- 使用sh shell比较字符串
- 在Bash中测试非零长度字符串:[-n "$var"]或["$var"]
- 如何创建Bash别名?
- 如何设置ssh超时时间?
- 给定一个类,查看实例是否有方法(Ruby)
- 将所有变量从一个shell脚本传递到另一个?
- 只列出UNIX中的目录
- 在日历应用程序中建模重复事件的最佳方法是什么?
- 如何删除shell脚本中文件名的扩展名?
- 'find -exec'是Linux中的shell函数
- 如何创建一个私有类方法?
- 临时更改bash中的当前工作目录以运行命令