转载:http://developer.51cto.com/art/201202/315066.htm

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

51CTO推荐专题:Node.js专区

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

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

  1. #!/bin/bashSTART=$(date +%s)
  2. # 洗菜之类的事先准备吧
  3. du -m /home > /tmp/output
  4. # 吃完了
  5. END=$(date +%s)
  6. DIFF=$(( $END - $START ))
  7. echo "化了$DIFF 秒搞定"
  8. chmod +x diff.sh
  9. sh diff.sh

执行结果如下:

化了0 秒搞定

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

  1. #!/usr/bin/env node
  2. var util  = require('util'),
  3. spawn = require('child_process').spawn,
  4. ls    = spawn('du', ['-m','/home/']);
  5. var start = +new Date();
  6. ls.stdout.on('data', function (data) {
  7. //console.log('stdout: ' + data);
  8. });
  9. ls.stderr.on('data', function (data) {
  10. console.log('stderr: ' + data);
  11. });
  12. ls.on('exit', function (code) {
  13. var end = + new Date();
  14. console.log(end-start);
  15. });

执行一下./diff.js:

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

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

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

  1. #!/usr/bin/env node
  2. var p = require('procstreams');
  3. p('cat app.log').pipe('wc -l')
  4. .data(function(stdout, stderr) {
  5. console.log(stdout);
  6. });

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

  1. #!/usr/bin/env node
  2. var p = require('procstreams');
  3. p('mkdir foo')
  4. .and('rm file.txt')
  5. .on('exit', function() {
  6. console.log('done');
  7. });

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

  1. #!/usr/bin/env node
  2. var util  = require('util'),
  3. spawn = require('child_process').spawn;
  4. var argv = require('optimist').argv;
  5. var cmd =  argv.cmd;
  6. var args = argv.args
  7. var option = argv.opt
  8. console.log(cmd + '  ' + args + '  ' + option);
  9. var ls    = spawn(cmd , [args ,option]);
  10. ls.stdout.on('data', function (data) {
  11. if (!data || !!data)  console.log(' i believe it');
  12. });
  13. ls.stderr.on('data', function (data) {
  14. console.log('It\'s a miracle!');
  15. });
  16. ls.on('exit', function (code) {
  17. console.log('it.justHappened();');
  18. });

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

当Shell遇上了Node.js(转载)的更多相关文章

  1. (转)在Windows平台上安装Node.js及NPM模块管理

    本文转载自:http://www.cnblogs.com/seanlv/archive/2011/11/22/2258716.html 之前9月份的时候我写了一篇关于如何在Windows平台上手工管理 ...

  2. 在Visual Studio 2013 上开发Node.js程序

    [题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio ...

  3. 如何在CentOS 7上安装Node.js和npm

    Node.js是一个跨平台的JavaScript运行时环境,允许在服务器端执行JavaScript代码.Node.js主要用于后端,但也作为全栈和前端解决方案而流行. npm,Node软件包管理器的缩 ...

  4. 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure

    [题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...

  5. 在Visual Studio上开发Node.js程序

    [题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio ...

  6. [译]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 ...

  7. CentOS上安装Node.js

    CentOS上安装Node.js [日期:2014-07-21] 来源:Linux社区  作者:maskdfe [字体:大 中 小]     CentOS上安装Node.js(想在Linux上学习No ...

  8. 在 Ubuntu 14.04/15.04 上配置 Node JS v4.0.0

    大家好,Node.JS 4.0 发布了,这个流行的服务器端 JS 平台合并了 Node.js 和 io.js 的代码,4.0 版就是这两个项目结合的产物——现在合并为一个代码库.这次最主要的变化是 N ...

  9. Deepin 15.5上安装 Node.js

    Node.js 源码安装 以下部分我们将介绍在Ubuntu Linux下安装 Node.js . 其他的Linux系统,如Centos等类似如下安装步骤. 在 Github 上获取 Node.js 源 ...

随机推荐

  1. JQuery文档加载完成执行js的几种方法

    js中文档加载完毕.一般在body加一个onload事件或者window.onload = function () {} jQuery中有好多写法,平时也不注意,别人一问,还真觉得头大. 下面是我整理 ...

  2. Node.js概述

    Node.js最重要的特性:通过单线程实现异步处理环境 Node.js解决的问题: Node.js修改了客户端连接服务器端的连接方法,不需要为每个客户端连接创建一个新的线程,而是为每个客户端连接触发一 ...

  3. Python 之__slots__的作用

    # 注意:__slots__ 用来限制当前类的实例属性的,如:name.age才可被使用,添加其他的属性则报错 # 不会限制继承类的属性 class Person(): __slots__ = (&q ...

  4. Python 之动态添加属性以及方法

    import types class Person(object): def __init__(self, newName, newAge): self.name = newName self.age ...

  5. spring IOC bean中注入集合

    建立一个实体 package com.java.test4; import java.util.*; /** * @author nidegui * @create 2019-06-22 14:45 ...

  6. Dinic当前弧优化 模板及教程

    在阅读本文前,建议先自学最大流的Ek算法. 引入 Ek的核心是执行bfs,一旦找到增广路就停下来进行增广.换言之,执行一遍BFS执行一遍DFS,这使得效率大大降低.于是我们可以考虑优化. 核心思路 在 ...

  7. CODEVS 3500

    题目描述 输入3个数a,b,c,求a^b mod c=?输入描述          三个数a,b,c输出描述         一个数,即a^b mod c 的答案.样例输入5 10 9样例输出 4 基 ...

  8. SLF4J和Logback和Log4j和Logging的区别与联系

    本文转载自:一个著名的日志系统是怎么设计出来的?(作者:刘欣) 前言 Java帝国在诞生之初就提供了集合.线程.IO.网络等常用功能,从C和C++领地那里吸引了大量程序员过来加盟,但是却有意无意地忽略 ...

  9. SSL常用专业缩略语汇总

    JKS - Java KeyStore JAVA密钥库 OCSP - Online Certificate Status Protocol证书在线状态协议. SAN - Subject Alterna ...

  10. springMVC+springJDBC+Msql注解模式

    最近基于Spring4.X以上的版本写了一个springMVC+springJDBC+Msql注解模式的一个项目,之中也遇到过很多问题 ,为了防止以后遇到同样问题现记录一下知识点以及详细配置. 首先我 ...