當(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í)繪圖