當(dāng)Shell遇上了Node.js
好吧,我承認(rèn),這個(gè)標(biāo)題有點(diǎn)曖昧的基情,但是希望下文的內(nèi)部能給不熟悉或不喜歡Shell或WIN平臺(tái)下的批處理編寫的工程師帶來一些幫助。
51CTO推薦專題:Node.js專區(qū)
首先,我承認(rèn)Shell腳本配置sed,awk等工作已經(jīng)相當(dāng)強(qiáng)大了,熟悉的朋友就對(duì)下面的內(nèi)容一笑而過吧,但是如果你喜歡上了NODE,那就讓我們繼續(xù)旅程吧:
好吧,先做一段簡(jiǎn)單的Shell得到時(shí)間差代碼的冷菜diff.sh:
- #!/bin/bashSTART=$(date +%s)
 - # 洗菜之類的事先準(zhǔn)備吧
 - du -m /home > /tmp/output
 - # 吃完了
 - END=$(date +%s)
 - DIFF=$(( $END - $START ))
 - echo "化了$DIFF 秒搞定"
 - chmod +x diff.sh
 - sh diff.sh
 
執(zhí)行結(jié)果如下:
化了0 秒搞定
~o,能吃這么塊嗎,難道BUG了吧,好吧,是速度太快了,只是腳本中采用的是秒數(shù)級(jí)別的范圍,估計(jì)只能用納秒也進(jìn)行,并在Shell做除法運(yùn)算。好吧,再采用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);
 - });
 
執(zhí)行一下./diff.js:
1113
時(shí)間直接顯示是毫秒級(jí)別,是不是感覺更舒服些,好吧,我承認(rèn)做這樣的比較,并不是說要一決高低,只是用前端攻城師喜歡的方式工具去做菜,依賴于Shell的強(qiáng)大功能基礎(chǔ)之上,當(dāng)然喜歡不同的語言的攻城師也可以用Python,Ruby之類的語言去實(shí)現(xiàn)。
好的,如果你覺得有趣,那就接著跟著我向前,否則就直接拍磚吧,哈哈。
以上示例可以看到,借用Shell腳本,NodeJs內(nèi)置功能做一些常用的小菜是很方便的而且很靈活,Shell腳本功能的強(qiáng)大之為就是流的重定向處理等,是不是需要采用寫成腳本或直接如果采用一采超復(fù)雜的命令來搞定,呵呵,對(duì)我們之為的非系統(tǒng)管理員可能有一定的難度,好,那就拿出強(qiáng)大點(diǎn)的菜刀procstreams,看看它是怎么做菜的吧:
- #!/usr/bin/env node
 - var p = require('procstreams');
 - p('cat app.log').pipe('wc -l')
 - .data(function(stdout, stderr) {
 - console.log(stdout);
 - });
 
上面的JS代碼是實(shí)現(xiàn)統(tǒng)計(jì)app.log的行數(shù),相當(dāng)于Shell的cat app.log | wc -l功能,感覺怎樣,如果要實(shí)現(xiàn)復(fù)雜或交互的功能,會(huì)不會(huì)更靈活些呢。再上一菜
- #!/usr/bin/env node
 - var p = require('procstreams');
 - p('mkdir foo')
 - .and('rm file.txt')
 - .on('exit', function() {
 - console.log('done');
 - });
 
是不是很熟悉的感覺? 如果執(zhí)行腳本的時(shí)還需要處理復(fù)雜一些的參數(shù)對(duì)應(yīng)的問題,怎么辦?沒關(guān)系,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();');
 - });
 
~親,謝謝你,一直走到了最后,以上只是個(gè)人在工作寫有些寫Shell腳本時(shí)常因?yàn)橐粋€(gè)空格或格式之類的情況查找半天而抓狂不已,以后采用和NODEJS結(jié)合會(huì)不會(huì)更淡定些,請(qǐng)各各抒己見,歡迎拍磚吧。
原文:http://club.cnodejs.org/topic/4f2a2f80aa8e490b1106909b
【編輯推薦】
- 走近Node.js的異步代碼設(shè)計(jì)
 - Node.js的循環(huán)依賴
 - 用Eclipse調(diào)試Node.js代碼
 - Node.js后端框架設(shè)計(jì)構(gòu)想
 - 用Web socket和Node.js實(shí)現(xiàn)HTML 5畫布的實(shí)時(shí)繪圖
 















 
 
 







 
 
 
 