精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Node.js 命令行程序開(kāi)發(fā)教程

開(kāi)發(fā) 開(kāi)發(fā)工具
一種編程語(yǔ)言是否易用,很大程度上,取決于開(kāi)發(fā)命令行程序的能力。

一種編程語(yǔ)言是否易用,很大程度上,取決于開(kāi)發(fā)命令行程序的能力。

Node.js 作為目前最熱門的開(kāi)發(fā)工具之一,怎樣使用它開(kāi)發(fā)命令行程序,是 Web 開(kāi)發(fā)者應(yīng)該掌握的技能。

Node.js 命令行程序開(kāi)發(fā)教程

最近,Npm的網(wǎng)志有一組系列文章,我覺(jué)得寫得非常好。下面就是我在它的基礎(chǔ)上擴(kuò)展的教程,應(yīng)該是目前***的解決方案了。

一、可執(zhí)行腳本

我們從最簡(jiǎn)單的講起。

首先,使用 JavaScript 語(yǔ)言,寫一個(gè)可執(zhí)行腳本 hello 。

#!/usr/bin/env node
console.log('hello world');

然后,修改 hello 的權(quán)限。

$ chmod 755 hello

現(xiàn)在,hello 就可以執(zhí)行了。

$ ./hello
hello world

如果想把 hello 前面的路徑去除,可以將 hello 的路徑加入環(huán)境變量 PATH。但是,另一種更好的做法,是在當(dāng)前目錄下新建 package.json ,寫入下面的內(nèi)容。

{
  "name": "hello",
  "bin": {
    "hello": "hello"
  }
}

然后執(zhí)行 npm link 命令。

$ npm link

現(xiàn)在再執(zhí)行 hello ,就不用輸入路徑了。

$ hello
hello world

二、命令行參數(shù)的原始寫法

命令行參數(shù)可以用系統(tǒng)變量 process.argv 獲取。

#!/usr/bin/env node
console.log('hello ', process.argv[2]);

執(zhí)行時(shí),直接在腳本文件后面,加上參數(shù)即可。

$ ./hello tom
hello tom

三、新建進(jìn)程

腳本可以通過(guò) child_process 模塊新建子進(jìn)程,從而執(zhí)行 Unix 系統(tǒng)命令。

#!/usr/bin/env node
var name = process.argv[2];
var exec = require('child_process').exec;

var child = exec('echo hello ' + name, function(err, stdout, stderr) {
  if (err) throw err;
  console.log(stdout);
});

用法如下。

$ ./hello tom
hello tom

四、shelljs 模塊

shelljs 模塊重新包裝了 child_process,調(diào)用系統(tǒng)命令更加方便。它需要安裝后使用。

npm install --save shelljs

然后,改寫腳本。

#!/usr/bin/env node
var name = process.argv[2];
var shell = require("shelljs");

shell.exec("echo hello " + name);

上面代碼是 shelljs 的本地模式,即通過(guò) exec 方法執(zhí)行 shell 命令。此外還有全局模式,允許直接在腳本中寫 shell 命令。

require('shelljs/global');

if (!which('git')) {
  echo('Sorry, this script requires git');
  exit(1);
}

mkdir('-p', 'out/Release');
cp('-R', 'stuff/*', 'out/Release');

cd('lib');
ls('*.js').forEach(function(file) {
  sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
  sed('-i', /.*REMOVE_THIS_LINE.*/n/, '', file);
  sed('-i', /.*REPLACE_LINE_WITH_MACRO.*/n/, cat('macro.js'), file);
});
cd('..');

if (exec('git commit -am "Auto-commit"').code !== 0) {
  echo('Error: Git commit failed');
  exit(1);
}

五、yargs 模塊

shelljs 只解決了如何調(diào)用 shell 命令,而 yargs 模塊能夠解決如何處理命令行參數(shù)。它也需要安裝。

$ npm install --save yargs

yargs 模塊提供 argv 對(duì)象,用來(lái)讀取命令行參數(shù)。請(qǐng)看改寫后的 hello 。

#!/usr/bin/env node
var argv = require('yargs').argv;

console.log('hello ', argv.name);

使用時(shí),下面兩種用法都可以。

$ hello --name=tom
hello tom

$ hello --name tom
hello tom

如果將 argv.name 改成 argv.n,就可以使用一個(gè)字母的短參數(shù)形式了。

$ hello -n tom
hello tom

可以使用 alias 方法,指定 name 是 n 的別名。

#!/usr/bin/env node
var argv = require('yargs')
  .alias('n', 'name')
  .argv;

console.log('hello ', argv.n);

這樣一來(lái),短參數(shù)和長(zhǎng)參數(shù)就都可以使用了。

$ hello -n tom
hello tom
$ hello --name tom
hello tom

argv 對(duì)象有一個(gè)下劃線(_)屬性,可以獲取非連詞線開(kāi)頭的參數(shù)。

#!/usr/bin/env node
var argv = require('yargs').argv;

console.log('hello ', argv.n);
console.log(argv._);

用法如下。

$ hello A -n tom B C
hello  tom
[ 'A', 'B', 'C' ]

六、命令行參數(shù)的配置

yargs 模塊還提供3個(gè)方法,用來(lái)配置命令行參數(shù)。

  • demand:是否必選
  • default:默認(rèn)值
  • describe:提示
#!/usr/bin/env node
var argv = require('yargs')
  .demand(['n'])
  .default({n: 'tom'})
  .describe({n: 'your name'})
  .argv;

console.log('hello ', argv.n);

上面代碼指定 n 參數(shù)不可省略,默認(rèn)值為 tom,并給出一行提示。

options 方法允許將所有這些配置寫進(jìn)一個(gè)對(duì)象。

#!/usr/bin/env node
var argv = require('yargs')
  .option('n', {
    alias : 'name',
    demand: true,
    default: 'tom',
    describe: 'your name',
    type: 'string'
  })
  .argv;

console.log('hello ', argv.n);

有時(shí),某些參數(shù)不需要值,只起到一個(gè)開(kāi)關(guān)作用,這時(shí)可以用 boolean 方法指定這些參數(shù)返回布爾值。

#!/usr/bin/env node
var argv = require('yargs')
  .boolean(['n'])
  .argv;

console.log('hello ', argv.n);

上面代碼中,參數(shù) n 總是返回一個(gè)布爾值,用法如下。

$ hello
hello  false
$ hello -n
hello  true
$ hello -n tom
hello  true

boolean 方法也可以作為屬性,寫入 option 對(duì)象。

#!/usr/bin/env node
var argv = require('yargs')
  .option('n', {
    boolean: true
  })
  .argv;

console.log('hello ', argv.n);

七、幫助信息

yargs 模塊提供以下方法,生成幫助信息。

  • usage:用法格式
  • example:提供例子
  • help:顯示幫助信息
  • epilog:出現(xiàn)在幫助信息的結(jié)尾
#!/usr/bin/env node
var argv = require('yargs')
  .option('f', {
    alias : 'name',
    demand: true,
    default: 'tom',
    describe: 'your name',
    type: 'string'
  })
  .usage('Usage: hello [options]')
  .example('hello -n tom', 'say hello to Tom')
  .help('h')
  .alias('h', 'help')
  .epilog('copyright 2015')
  .argv;

console.log('hello ', argv.n);

執(zhí)行結(jié)果如下。

$ hello -h

Usage: hello [options]

Options:
  -f, --name  your name [string] [required] [default: "tom"]
  -h, --help  Show help [boolean]

Examples:
  hello -n tom  say hello to Tom

copyright 2015

八、子命令

yargs 模塊還允許通過(guò) command 方法,設(shè)置 Git 風(fēng)格的子命令。

#!/usr/bin/env node
var argv = require('yargs')
  .command("morning", "good morning", function (yargs) {
    console.log("Good Morning");
  })
  .command("evening", "good evening", function (yargs) {
    console.log("Good Evening");
  })
  .argv;

console.log('hello ', argv.n);

用法如下。

$ hello morning -n tom
Good Morning
hello tom

可以將這個(gè)功能與 shellojs 模塊結(jié)合起來(lái)。

#!/usr/bin/env node
require('shelljs/global');
var argv = require('yargs')
  .command("morning", "good morning", function (yargs) {
    echo("Good Morning");
  })
  .command("evening", "good evening", function (yargs) {
    echo("Good Evening");
  })
  .argv;

console.log('hello ', argv.n);

每個(gè)子命令往往有自己的參數(shù),這時(shí)就需要在回調(diào)函數(shù)中單獨(dú)指定。回調(diào)函數(shù)中,要先用 reset 方法重置 yargs 對(duì)象。

#!/usr/bin/env node
require('shelljs/global');
var argv = require('yargs')
  .command("morning", "good morning", function (yargs) {  
    echo("Good Morning");
    var argv = yargs.reset()
      .option("m", {
        alias: "message",
        description: "provide any sentence"
      })
      .help("h")
      .alias("h", "help")
      .argv;

    echo(argv.m);
  })
  .argv;

用法如下。

$ hello morning -m "Are you hungry?"
Good Morning
Are you hungry?

九、其他事項(xiàng)

(1)返回值

根據(jù) Unix 傳統(tǒng),程序執(zhí)行成功返回 0,否則返回 1 。

if (err) {
  process.exit(1);
} else {
  process.exit(0);
}

(2)重定向

Unix 允許程序之間使用管道重定向數(shù)據(jù)。

$ ps aux | grep 'node'

腳本可以通過(guò)監(jiān)聽(tīng)標(biāo)準(zhǔn)輸入的data 事件,獲取重定向的數(shù)據(jù)。

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(data) {
  process.stdout.write(data);
});

下面是用法:

$ echo 'foo' | ./hello
hello foo

(3)系統(tǒng)信號(hào)

操作系統(tǒng)可以向執(zhí)行中的進(jìn)程發(fā)送信號(hào),process 對(duì)象能夠監(jiān)聽(tīng)信號(hào)事件。

process.on('SIGINT', function () {
  console.log('Got a SIGINT');
  process.exit(0);
});

發(fā)送信號(hào)的方法如下。

$ kill -s SIGINT [process_id]

 

責(zé)任編輯:王雪燕 來(lái)源: 阮一峰的網(wǎng)絡(luò)日志
相關(guān)推薦

2023-03-31 08:44:55

Go開(kāi)發(fā)命令

2010-07-15 10:58:23

Perl命令行程序

2016-03-28 10:00:09

Swift命令程序

2019-04-16 06:50:34

2019-01-03 09:06:55

Node.js命令行工具 前端

2024-04-26 09:44:39

2012-09-29 11:13:15

Node.JS前端開(kāi)發(fā)Node.js打包

2015-03-10 10:59:18

Node.js開(kāi)發(fā)指南基礎(chǔ)介紹

2022-09-23 09:50:45

Python

2022-09-27 13:07:41

clickPython命令行

2013-05-17 09:41:02

Node.js云應(yīng)用開(kāi)發(fā)IaaS

2014-02-14 10:48:32

Visual StudNode.js

2025-08-26 03:00:00

2019-06-10 15:00:27

node命令行前端

2020-12-11 06:44:16

命令行工具開(kāi)發(fā)

2020-12-10 16:16:08

工具代碼開(kāi)發(fā)

2013-11-01 09:34:56

Node.js技術(shù)

2010-09-01 14:23:54

Linux命令行開(kāi)發(fā)

2023-04-02 14:09:51

2014-02-19 16:28:53

Node.jsWeb工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美aaaaaaa| 中国一级特黄视频| 久本草在线中文字幕亚洲| 亚洲亚洲精品在线观看| 精品无码久久久久久久动漫| 中文字幕在线观看视频免费| 亚洲精品a级片| 亚洲国产精品字幕| 亚洲国产成人va在线观看麻豆| 91cn在线观看| 久久色成人在线| 国产日韩亚洲欧美| 国产第一页在线播放| 国产精品密蕾丝视频下载| 91精品国产色综合久久ai换脸| 日韩在线观看a| 国产一级免费在线观看| 国产一区欧美二区| 青青青国产精品一区二区| 中文国语毛片高清视频| 国产精品chinese在线观看| 色婷婷久久久综合中文字幕| 2021国产视频| 国产高清视频在线观看| 国产成人免费视| 国产精品成人va在线观看| 久久精品这里有| 四虎成人av| 亚洲精品一区二三区不卡| 麻豆网站免费观看| 成人黄色视屏网站| 婷婷中文字幕一区三区| 久久久久久久久影视| av免费在线一区二区三区| 99久久精品国产一区二区三区| 亚洲aⅴ男人的天堂在线观看 | 久久国产色av| 小早川怜子久久精品中文字幕| 911精品国产| 欧美日韩中文字幕一区二区| 国产精品免费入口| 超免费在线视频| 亚洲三级久久久| 手机在线观看国产精品| 欧美婷婷久久五月精品三区| av成人免费在线观看| 99r国产精品视频| 国产欧美第一页| 免费成人在线观看视频| 日韩免费av一区二区| 天天爽夜夜爽夜夜爽精品| 欧美成人69| 免费成人高清视频| 午夜激情福利网| 91欧美日韩| 日韩视频永久免费观看| 国产不卡在线观看视频| 日本久久一二三四| 中文字幕不卡在线视频极品| 无码一区二区三区在线| 国产剧情一区| 伊人激情综合网| 国产精品免费无码| 热久久天天拍国产| 久久夜色精品国产亚洲aⅴ| 亚洲波多野结衣| 亚洲成人日韩| 久久6免费高清热精品| 黄色a级片在线观看| 中文字幕乱码亚洲无线精品一区| 日韩视频免费看| 欧美另类videoxo高潮| 一区二区三区在线电影| 欧美第一页在线| 国产午夜精品无码| 性色一区二区| 国产精品久久久久91| 中文字幕你懂的| 国产美女在线观看一区| 亚洲精品欧美日韩专区| 老熟妇高潮一区二区高清视频| 99精品久久只有精品| 美媛馆国产精品一区二区| 国产在线观看网站| 国产精品福利一区二区三区| 激情图片qvod| 91色在线看| 日本韩国欧美国产| 91丨九色丨蝌蚪| 日韩一区二区三区在线看| 亚洲成avwww人| 国产传媒第一页| 奇米影视亚洲| 久久久久久久久久国产| 无码人妻丰满熟妇区bbbbxxxx| 免费高清不卡av| 不卡的av一区| 成人在线免费看| 亚洲精品视频在线看| 国产精品久久中文字幕| 成人在线不卡| 欧美mv和日韩mv国产网站| 玖玖爱在线观看| 国产精品久久久乱弄| 午夜剧场成人观在线视频免费观看| 97久久久久久久| 国内精品自线一区二区三区视频| 国产成人免费观看| 国产精品久久一区二区三区不卡| 亚洲免费观看高清完整版在线观看熊 | www.xxxx精品| 国产精品午夜影院| 韩国一区二区在线观看| 蜜桃免费一区二区三区| 在线中文字幕-区二区三区四区 | 成品人视频ww入口| 国产精品字幕| 亚洲精品国产电影| 午夜精品一区二区三区视频| 亚洲一区欧美二区| 91嫩草免费看| 色影院视频在线| 欧美性jizz18性欧美| 久久久久亚洲av无码专区首jn| 精品理论电影| 久久久噜久噜久久综合| 国产欧美一区二区三区视频在线观看| 91麻豆免费观看| 欧美成人精品免费| 精品国产不卡一区二区| 国产一区二区三区18| 丁香六月婷婷综合| 成人av资源在线| 免费网站永久免费观看| 成人激情久久| 中文字幕日韩高清| 亚洲第一网站在线观看| 99国产欧美久久久精品| 久久精品无码中文字幕| 日韩精品一区二区三区中文| 日韩有码在线视频| 亚洲无码精品在线播放| 久久精品水蜜桃av综合天堂| 欧美日韩激情视频在线观看| 91蝌蚪精品视频| 欧美激情免费在线| 午夜精品久久久久久久第一页按摩| 中文字幕一区二区三区四区| 久久久久国产一区| 波多野结衣在线播放一区| 日韩免费不卡av| 国产免费av在线| 色拍拍在线精品视频8848| 国产精品无码久久久久一区二区| 一本色道久久综合亚洲精品高清 | 国产成人精品视频ⅴa片软件竹菊| 欧美绝顶高潮抽搐喷水合集| 午夜精品一区二区三区av| 熟妇人妻中文av无码| 午夜久久福利影院| 第四色在线视频| 国产精品久久久一区二区| 久久国产日韩欧美| 二区三区不卡| 一区二区三区无码高清视频| 一级黄色大毛片| 亚洲免费观看高清完整版在线观看熊| 国产又粗又猛又爽又黄| 国产在线日韩| 精品视频在线观看| 日日av拍夜夜添久久免费| 中文国产亚洲喷潮| 国产三级漂亮女教师| 亚洲综合av网| 亚洲欧美视频在线播放| 日韩精品电影在线| 中文字幕中文字幕在线中心一区 | 欧美在线视频你懂得| 99自拍偷拍视频| 国产乱码精品一区二区三区av| 青青草国产免费| 婷婷五月色综合香五月| 国产精品免费一区| 免费不卡av| 日韩精品有码在线观看| 亚洲天堂avav| 亚洲图片欧美综合| 我不卡一区二区| 国产精品综合av一区二区国产馆| 欧美日韩不卡在线视频| 精品国产乱码久久久久久蜜坠欲下 | 日韩欧美在线观看一区二区三区| 国产精品2020| 欧美激情在线免费观看| 伊人av在线播放| 视频在线观看一区| 自拍偷拍视频在线| 日日狠狠久久偷偷综合色| 国产精品综合网站| 国产精品一区二区日韩| 神马国产精品影院av| 国产77777| 欧美日韩一二三区| 国产成人自拍视频在线| 中文字幕在线免费不卡| 黄色性生活一级片| 国产自产2019最新不卡| 116极品美女午夜一级| 欧美激情无毛| 婷婷久久青草热一区二区 | 国产极品人妖在线观看| 伊人伊成久久人综合网小说| 亚洲美女福利视频| 欧美日韩国产综合一区二区| 久久狠狠高潮亚洲精品| 亚洲同性gay激情无套| av直播在线观看| 懂色av一区二区三区免费观看| 五月婷婷六月丁香激情| 性伦欧美刺激片在线观看| 欧美中日韩在线| 五月精品视频| 日韩一本精品| 欧美日韩一本| 国产麻豆乱码精品一区二区三区 | 欧美日韩激情在线| 国产成人亚洲精品自产在线| 亚洲精品成a人| 91n在线视频| 国产欧美日韩亚州综合| 蜜桃精品成人影片| 成人av在线网| 一区二区在线免费观看视频| 久久精品国产秦先生| 国产熟人av一二三区| 亚洲综合丁香| 狠狠干 狠狠操| 欧美精品国产一区| av磁力番号网| 在线免费观看日本欧美爱情大片| 亚洲激情一区二区| 九九视频免费观看视频精品| 久久99九九| 色婷婷狠狠五月综合天色拍| 国产一区二区免费电影| 草莓视频一区二区三区| 国产91精品入口17c| 8x国产一区二区三区精品推荐| 999视频在线免费观看| 麻豆一区在线| 91精品黄色| 在线播放一区二区精品视频| 99在线热播| 精品视频高潮| 久久99精品久久久久久久青青日本| 卡一精品卡二卡三网站乱码| 国产一区二区三区黄| 欧美一级三级| 人禽交欧美网站免费| 国产精品美女久久久久久不卡| 日韩一区国产在线观看| 日韩精品1区| 欧美爱爱视频网站| 欧美黄污视频| 人妻少妇精品久久| 亚洲自拍另类| 男女污污的视频| 狠狠久久亚洲欧美| 性生交大片免费看l| 成人18视频在线播放| 五级黄高潮片90分钟视频| 中文字幕精品一区二区精品绿巨人| 中文字幕在线观看二区| 亚洲精品高清在线观看| 四虎永久在线精品| 色综合久久66| 97精品人妻一区二区三区| 日韩精品一区二区三区老鸭窝| 天天色综合av| 中文字幕九色91在线| 91亚洲天堂| 日本精品一区二区三区在线播放视频| 成人福利片在线| 99九九视频| 精品一区免费| 天堂v在线视频| 9国产精品视频| 黄色永久免费网站| 粉嫩一区二区三区在线看| 五级黄高潮片90分钟视频| 国产精品久久久久久久久免费桃花 | 国产目拍亚洲精品99久久精品| 亚洲精品卡一卡二| 欧美日韩亚洲视频一区| 国产一区二区三区四区视频| 亚洲精品在线观看网站| av在线三区| 久久久久久久久电影| 免费成人高清在线视频| 国产精品日韩一区二区| 91影院成人| 一女被多男玩喷潮视频| 国产在线视视频有精品| 精品无码一区二区三区| 伊人开心综合网| 中国a一片一级一片| 亚洲国产中文字幕久久网| 求av网址在线观看| 欧美中文在线观看| 亚洲精品一二三**| 一本久久a久久精品vr综合| 亚洲巨乳在线| 一级黄色高清视频| 国产精品欧美久久久久无广告| 日本网站免费观看| 欧美一区二区三级| 国产福利在线看| 91黑丝在线观看| 涩爱av色老久久精品偷偷鲁| 日韩精品欧美一区二区三区| 亚洲免费播放| 绯色av蜜臀vs少妇| 亚洲视频网在线直播| 中文字幕手机在线视频| 亚洲成avwww人| 日本片在线观看| 91色中文字幕| 999久久久精品国产| 男人舔女人下面高潮视频| 99视频一区二区三区| 精品深夜av无码一区二区老年| 欧美精品亚洲二区| 午夜视频在线| 国产精品看片资源| 国产精品免费99久久久| 成人观看免费完整观看| av不卡一区二区三区| 国产一级一级片| 日韩精品在线一区| 人妖欧美1区| 99久久精品免费看国产四区 | 日韩不卡高清视频| 亚洲精品中文字幕有码专区| 日本在线播放一二三区| 国语精品免费视频| 亚洲免费精品| 加勒比精品视频| 精品成人av一区| 亚洲欧美综合一区二区| 538国产精品一区二区免费视频| 成人在线视频你懂的| xxxx18hd亚洲hd捆绑| 成人h动漫精品| 天堂网av手机版| 亚洲欧美日韩综合| 九九九伊在线综合永久| 亚洲国产日韩美| 经典三级在线一区| 欧美成人免费观看视频| 欧美成人福利视频| 激情aⅴ欧美一区二区欲海潮| 国产伦精品一区二区三区四区免费| 99riav国产精品| 非洲一级黄色片| 欧美主播一区二区三区美女| 午夜在线视频| 99c视频在线| 国产日韩视频| 黄色片网站免费| 7777精品伊人久久久大香线蕉完整版| 国产黄色小视频在线| 成人在线免费网站| 亚洲免费网址| 91免费在线看片| 日韩一区二区在线观看视频 | 国产成人一区二区| 日韩国产综合| 亚洲精品久久久久久| 午夜视频在线观看一区| 噜噜噜噜噜在线视频| 国产欧美久久一区二区| 欧美女人交a| 精品人妻无码一区二区三区| 欧美日韩亚洲综合在线| 羞羞视频在线观看不卡| 麻豆av一区二区三区| 美腿丝袜一区二区三区| 免费麻豆国产一区二区三区四区| 亚洲国产日韩欧美在线动漫| 精品欧美一区二区三区在线观看| 三年中国中文在线观看免费播放| 成人一区二区三区视频在线观看| 国产免费一区二区三区四区五区| 久久精品视频网站| 青青操综合网| 波多野结衣免费观看| 好吊成人免视频| 成人影院www在线观看| 鲁鲁狠狠狠7777一区二区| 国内精品视频一区二区三区八戒 |