当Shell遇上了NodeJs

好吧,我承认,这个标题有点暧昧的基情,但是希望下文的内部能给不熟悉或不喜欢Shell或WIN平台下的批处理编写的工程师带来一些帮助。

首先,我承认Shell脚本配置sed,awk等工作已经相当强大了,熟悉的朋友就对下面的内容一笑而过吧,但是如果你喜欢上了NODE,那就让我们继续旅程吧:

好吧,先做一段简单的Shell得到时间差代码的冷菜diff.sh:

#!/bin/bashSTART=$(date +%s)
# 洗菜之类的事先准备吧
du -m /home > /tmp/output
# 吃完了
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "化了$DIFF 秒搞定" 

chmod +x diff.sh
sh diff.sh

执行结果如下:

化了0 秒搞定

~o,能吃这么块吗,难道BUG了吧,好吧,是速度太快了,只是脚本中采用的是秒数级别的范围,估计只能用纳秒也进行,并在Shell做除法运算。好吧,再采用NODE试一把看看vim diff.js:

#!/usr/bin/env node
var util  = require('util'),
    spawn = require('child_process').spawn,
    ls    = spawn('du', ['-m','/home/']);
var start = +new Date();
ls.stdout.on('data', function (data) {
//console.log('stdout: ' + data);
});

ls.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});

ls.on('exit', function (code) {
  var end = + new Date();
  console.log(end-start);
});

执行一下./diff.js:

1113

时间直接显示是毫秒级别,是不是感觉更舒服些,好吧,我承认做这样的比较,并不是说要一决高低,只是用前端攻城师喜欢的方式工具去做菜,依赖于Shell的强大功能基础之上,当然喜欢不同的语言的攻城师也可以用Python,Ruby之类的语言去实现。

好的,如果你觉得有趣,那就接着跟着我向前,否则就直接拍砖吧,哈哈。

以上示例可以看到,借用Shell脚本,NodeJs内置功能做一些常用的小菜是很方便的而且很灵活,Shell脚本功能的强大之为就是流的重定向处理等,是不是需要采用写成脚本或直接如果采用一采超复杂的命令来搞定,呵呵,对我们之为的非系统管理员可能有一定的难度,好,那就拿出强大点的菜刀procstreams,看看它是怎么做菜的吧:

#!/usr/bin/env node
var p = require('procstreams');
p('cat app.log').pipe('wc -l')
  .data(function(stdout, stderr) {
      console.log(stdout);
  });

上面的JS代码是实现统计app.log的行数,相当于Shell的cat app.log | wc -l功能,感觉怎样,如果要实现复杂或交互的功能,会不会更灵活些呢。再上一菜

#!/usr/bin/env node
var p = require('procstreams');
    p('mkdir foo')
       .and('rm file.txt')
          .on('exit', function() {  
                console.log('done');  
           });

是不是很熟悉的感觉? 如果执行脚本的时还需要处理复杂一些的参数对应的问题,怎么办?没关系,node-optimist isaacs's nopt 之类的工作早就等着你们这类的攻城师呢?再上最后一道菜:

#!/usr/bin/env node
var util  = require('util'),
  spawn = require('child_process').spawn;
var argv = require('optimist').argv;
var cmd =  argv.cmd;
var args = argv.args
var option = argv.opt
console.log(cmd + '  ' + args + '  ' + option);
var ls    = spawn(cmd , [args ,option]);
ls.stdout.on('data', function (data) {
  if (!data || !!data)  console.log(' i believe it');
});

ls.stderr.on('data', function (data) {
  console.log('It\'s a miracle!');
});

ls.on('exit', function (code) {
   console.log('it.justHappened();');
});

~亲,谢谢你,一直走到了最后,以上只是个人在工作写有些写Shell脚本时常因为一个空格或格式之类的情况查找半天而抓狂不已,以后采用和NODEJS结合会不会更淡定些,请各各抒己见,欢迎拍砖吧。

参考资料:
http://nodejs.org
http://www.catonmat.net/blog/

https://github.com/shelljs/shelljs

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值