当Shell遇上了Node.js(转载)
转载:http://developer.51cto.com/art/201202/315066.htm
好吧,我承认,这个标题有点暧昧的基情,但是希望下文的内部能给不熟悉或不喜欢Shell或WIN平台下的批处理编写的工程师带来一些帮助。
51CTO推荐专题:Node.js专区
首先,我承认Shell脚本配置sed,awk等工作已经相当强大了,熟悉的朋友就对下面的内容一笑而过吧,但是如果你喜欢上了NODE,那就让我们继续旅程吧:
好吧,先做一段简单的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
执行结果如下:
化了0 秒搞定
~o,能吃这么块吗,难道BUG了吧,好吧,是速度太快了,只是脚本中采用的是秒数级别的范围,估计只能用纳秒也进行,并在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);
- });
执行一下./diff.js:
时间直接显示是毫秒级别,是不是感觉更舒服些,好吧,我承认做这样的比较,并不是说要一决高低,只是用前端攻城师喜欢的方式工具去做菜,依赖于Shell的强大功能基础之上,当然喜欢不同的语言的攻城师也可以用Python,Ruby之类的语言去实现。
好的,如果你觉得有趣,那就接着跟着我向前,否则就直接拍砖吧,哈哈。
以上示例可以看到,借用Shell脚本,NodeJs内置功能做一些常用的小菜是很方便的而且很灵活,Shell脚本功能的强大之为就是流的重定向处理等,是不是需要采用写成脚本或直接如果采用一采超复杂的命令来搞定,呵呵,对我们之为的非系统管理员可能有一定的难度,好,那就拿出强大点的菜刀procstreams,看看它是怎么做菜的吧:
- #!/usr/bin/env node
- var p = require('procstreams');
- p('cat app.log').pipe('wc -l')
- .data(function(stdout, stderr) {
- console.log(stdout);
- });
上面的JS代码是实现统计app.log的行数,相当于Shell的cat app.log | wc -l功能,感觉怎样,如果要实现复杂或交互的功能,会不会更灵活些呢。再上一菜
- #!/usr/bin/env node
- var p = require('procstreams');
- p('mkdir foo')
- .and('rm file.txt')
- .on('exit', function() {
- console.log('done');
- });
是不是很熟悉的感觉? 如果执行脚本的时还需要处理复杂一些的参数对应的问题,怎么办?没关系,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结合会不会更淡定些,请各各抒己见,欢迎拍砖吧。
当Shell遇上了Node.js(转载)的更多相关文章
- (转)在Windows平台上安装Node.js及NPM模块管理
本文转载自:http://www.cnblogs.com/seanlv/archive/2011/11/22/2258716.html 之前9月份的时候我写了一篇关于如何在Windows平台上手工管理 ...
- 在Visual Studio 2013 上开发Node.js程序
[题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio ...
- 如何在CentOS 7上安装Node.js和npm
Node.js是一个跨平台的JavaScript运行时环境,允许在服务器端执行JavaScript代码.Node.js主要用于后端,但也作为全栈和前端解决方案而流行. npm,Node软件包管理器的缩 ...
- 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure
[题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...
- 在Visual Studio上开发Node.js程序
[题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio ...
- [译]How to Install Node.js on Ubuntu 14.04 如何在ubuntu14.04上安装node.js
原文链接为 http://www.hostingadvice.com/how-to/install-nodejs-ubuntu-14-04/ 由作者Jacob Nicholson 发表于October ...
- CentOS上安装Node.js
CentOS上安装Node.js [日期:2014-07-21] 来源:Linux社区 作者:maskdfe [字体:大 中 小] CentOS上安装Node.js(想在Linux上学习No ...
- 在 Ubuntu 14.04/15.04 上配置 Node JS v4.0.0
大家好,Node.JS 4.0 发布了,这个流行的服务器端 JS 平台合并了 Node.js 和 io.js 的代码,4.0 版就是这两个项目结合的产物——现在合并为一个代码库.这次最主要的变化是 N ...
- Deepin 15.5上安装 Node.js
Node.js 源码安装 以下部分我们将介绍在Ubuntu Linux下安装 Node.js . 其他的Linux系统,如Centos等类似如下安装步骤. 在 Github 上获取 Node.js 源 ...
随机推荐
- Java_Web三大框架之Hibernate配置文件(二)
下面介绍一下编写Hibernate的配置文件,使用Hibernate操作数据库. 开始部署:下载需要的jar包 下载Hibernate Hibernat ...
- webstrom常用键
常用快捷键—Webstorm入门指南 提高代码编写效率,离不开快捷键的使用,Webstorm拥有丰富的代码快速编辑功能,你可以自由配置功能快捷键. 快捷键配置 点击“File”-> “setti ...
- 微信小程序video监测播放进度
video组件提供的进度相关的监测只有 bindtimeupdate ,官方说明这个函数250ms触发一次,在开发者工具上基本符合,但在真机上每隔1秒触发一次.达不到我们要求的精度.对比下音频,wx. ...
- vue02 过滤器、计算和侦听属性、vue对象的生命周期、阻止事件冒泡和刷新页面
3. Vue对象提供的属性功能 3.1 过滤器 过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 定义过滤器的方式有两种. 3.1.1 使用Vue.fil ...
- PAT-day1
1001 害死人不偿命的(3n+1)猜想 (15 分) 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ( 3n+1)砍掉一半.这样一直 ...
- java静态变量、实例变量和局部变
实例变量又称成员变量: 1⃣️成员变量定义在类中,在整个类中都可以被访问 2⃣️成员变量随着对象的建立而建立,随对象的消失而消失,存在于对象所在的对内存中 3⃣️成员变量有默认初始值 局部变量: 1⃣ ...
- js的一些工具类
//写入cookie function setCookie(name, value) { var Days = 30; //此 cookie 将被保存 30 天 var exp = n ...
- Luogu P2866 [USACO06NOV]糟糕的一天Bad Hair Day
P2866 [USACO06NOV]糟糕的一天Bad Hair Day 题目描述 Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a ...
- Linux常用shell命令持续总结
1. 查看端口运行 netstat -lnp|grep 80 2. 定时任务 Crontab -e 编辑任务 Crontab -l 查看当前任务列表 /var/log/cron-* 任务日志
- JAVA中 redisTemplate 和 jedis的配合使用
首先项目A,也就是SpringBOOT项目中使用redisTemplate 来做REDIS的缓存时,你会发现存到REDIS里边的KEY和VALUE,redisTemplat使用jdkSerialize ...