当Shell遇上了NodeJs
发布于 12 年前 作者 piaohai 17056 次浏览 最后一次编辑是 8 年前

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

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

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

<pre><code>#!/bin/bashSTART=$(date +%s)

洗菜之类的事先准备吧

du -m /home > /tmp/output

吃完了

END=$(date +%s) DIFF=$(( $END - $START )) echo “化了$DIFF 秒搞定”

chmod +x diff.sh sh diff.sh </code></pre>

<p>执行结果如下:</p>

<pre><code>化了0 秒搞定 </code></pre>

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

<pre><code>#!/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); }); </code></pre>

<p>执行一下./diff.js:</p>

<pre><code>1113 </code></pre>

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

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

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

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

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

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

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

<pre><code>#!/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();’); }); </code></pre>

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

<p>参考资料:<br/> <a href=“http://nodejs.org”>http://nodejs.org</a><br/> <a href=“http://www.catonmat.net/blog/”>http://www.catonmat.net/blog/</a></p>

8 回复

个人也觉得Shell(Bash)的语法让人抓狂

nodejs 的模块真是丰富多彩呀

来一个脚本语言,就要把它当shell脚本用用,哈哈哈

本人shell小白一个,处理常用的shell操作和简单的awk、sed总觉的有些吃力。 后来又要去学python… 现在看来可以用node去代替他们中的几个,在各自场景下发挥作用。

去看shelljs这个模块去

很实用! 请教一下,如果test.json文件里面有个对象数组[{name:‘123’}{name:‘345’}],怎么对这个数组进行操作,比如读取出来var obj = {name:‘123’},而不是打印出来?我用procstreams好像做不到

回到顶部