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