Rush——Ruby中的面向对象shell

Rush——Ruby中的shell——是一个使用Ruby语法的面向对象shell。面向对象意味着你操作和传递的不仅仅是字符串,而是带有自身方法和属性的、真正的Ruby对象。所以,使用者可以调用一个目录对象的ls方法来实现ls -l /var命令同样的功能:

\
rush\u0026gt; root['/var/'].ls
 //var/
 db+
 lib+
 log+
 run+
 [...]
\

Rush被认为是常见Unix环境中最常用的内建命令和核心工具包的替代品,并带有面向对象编程语言所能带来的全部益处。但rush所带来的还不单单是这些:

\
然而rush不仅只是一个交互式shell和一个库而已:它可以从单一位置操控任意数量的远程机器。在服务器之间复制文件或目录就像在本地一样无缝。
\

我们访问了rush的开发者Adam Wiggins。Adam开发rush开始时仅是为了满足自己的需求: 

\
当我刚开始使用Ruby的时候,我曾希望有一个Ruby语法的unix shell的替代品。我当时能做的就只能写那种满是倒引号(backticks)的shell脚本来作为Ruby脚本。
\

面向对象shell并不是一个新主张。例如微软已经连同Windows Server 2008一起发布了基于.NET的新版PowerShell,它也可看成是创建rush的灵感来源。Ruby强大的元编程能力使得扩展rush非常容易。例如,让我们来扩展Box(表示一台单独的机器),给其添加一个返回IP地址的方法。修改.rush/env.rb文件即可,我们可以简单地把新方法添加在它里面:

\
class Rush::Box
 def ip_address
 bash(\"ifconfig | grep inet | grep -v 127.0.0.1\").match(/addr:([\\d.]+)/)[1]
 end
end
\

回到rush,现在通过如下调用就可以打印本地的IP地址:

\
rush\u0026gt; Rush::Box.new.ip_address
 192.168.1.104
\

Wiggins已经使得例如启动和停止服务、数据库创建或者iptable规则操作等管理任务变得更加容易:

\
 [...] netstat -lptn可以指出什么进程在占用某个特定端口,但是却很难和其他操作结合起来。在rush中,你可以这样做:box.processes.each { |p| p.kill if p.listen_port == 3000 }
\

对于rush的长期目标:

\
重新实现/usr/bin中的(再加上bash内建的)数千个命令看上去是一个令人难以想象的任务。但是我怀疑其中的大部分基本 上很少使用。一个精心实现的小型子集可以满足其他unix用户们和我80%的需求——尤其是在集群管理领域,这个领域才是rush创建的真正原因。 rush库目前有约1500行代码,它已经可以涵盖大部分主要的文件和进程操作。我认为用10k行左右代码就可以在管理unix系统方面基本上实现我们想 做的事情。
\

更多关于rush的内容,请访问rush的官方站点或者加入rush的Google群组。需要注意的是RubyForge上的ruSH项目不是我们所说的rush项目,它看上去已经不再更新了。

\ 查看英文原文: Rush - OOP shell in Ruby
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值