当Shell遇上了Node.js

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

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

51CTO推荐专题:Node.js专区

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

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

  1. #!/bin/bashSTART=$(date +%s)  
  2. # 洗菜之类的事先准备吧  
  3. du -m /home > /tmp/output  
  4. # 吃完了  
  5. END=$(date +%s)  
  6. DIFF=$(( $END - $START ))  
  7. echo "化了$DIFF 秒搞定"   
  8.  
  9. chmod +x diff.sh  
  10. sh diff.sh 

执行结果如下:

化了0 秒搞定

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

  1. #!/usr/bin/env node  
  2. var util  = require('util'),  
  3.     spawn = require('child_process').spawn,  
  4.     ls    = spawn('du', ['-m','/home/']);  
  5. var start = +new Date();  
  6. ls.stdout.on('data', function (data) {  
  7. //console.log('stdout: ' + data);  
  8. });  
  9.  
  10. ls.stderr.on('data', function (data) {  
  11.   console.log('stderr: ' + data);  
  12. });  
  13.  
  14. ls.on('exit', function (code) {  
  15.   var end = + new Date();  
  16.   console.log(end-start);  
  17. }); 

执行一下./diff.js:

1113

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

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

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

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

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

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

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

  1. #!/usr/bin/env node  
  2. var util  = require('util'),  
  3.   spawn = require('child_process').spawn;  
  4. var argv = require('optimist').argv;  
  5. var cmd =  argv.cmd;  
  6. var args = argv.args  
  7. var option = argv.opt  
  8. console.log(cmd + '  ' + args + '  ' + option);  
  9. var ls    = spawn(cmd , [args ,option]);  
  10. ls.stdout.on('data', function (data) {  
  11.   if (!data || !!data)  console.log(' i believe it');  
  12. });  
  13.  
  14. ls.stderr.on('data', function (data) {  
  15.   console.log('It\'s a miracle!');  
  16. });  
  17.  
  18. ls.on('exit', function (code) {  
  19.    console.log('it.justHappened();');  
  20. }); 

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

 

原文:http://club.cnodejs.org/topic/4f2a2f80aa8e490b1106909b

【编辑推荐】

  1. 走近Node.js的异步代码设计
  2. Node.js的循环依赖
  3. 用Eclipse调试Node.js代码
  4. Node.js后端框架设计构想
  5. 用Web socket和Node.js实现HTML 5画布的实时绘图

 

 

 

责任编辑:陈贻新 来源: Node Club
相关推荐

2020-03-05 16:35:06

人脸识别口罩人工智能

2019-03-14 11:00:40

GoLua语言

2021-05-31 20:48:45

人工智能AI无人机

2015-03-10 10:59:18

Node.js开发指南基础介绍

2013-11-01 09:34:56

Node.js技术

2011-09-08 13:46:14

node.js

2011-09-02 14:47:48

Node

2011-11-01 10:30:36

Node.js

2011-09-09 14:23:13

Node.js

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js

2021-12-25 22:29:57

Node.js 微任务处理事件循环

2017-11-01 14:09:30

大数据心理学新零售

2020-05-29 15:33:28

Node.js框架JavaScript

2012-02-03 09:25:39

Node.js

2015-06-23 15:27:53

HproseNode.js

2020-10-26 08:34:13

Node.jsCORS前端

2021-04-06 10:15:29

Node.jsHooks前端

2021-02-01 15:42:45

Node.jsSQL应用程序

2021-07-09 00:24:10

No.jsNode.js原理
点赞
收藏

51CTO技术栈公众号