Wie einfach eine Programmiersprache zu verwenden ist, hängt weitgehend von ihrer Fähigkeit ab, Kommandozeilenprogramme zu entwickeln.
Da Node.js heute zu den beliebtesten Entwicklungswerkzeugen gehört, ist es eine Fähigkeit, die Webentwickler beherrschen sollten, zu wissen, wie man Node.js zur Entwicklung von Kommandozeilenprogrammen verwendet.

Kürzlich veröffentlichte der Npm-Blog eine Reihe vonArtikeln, die meiner Meinung nach sehr gut geschrieben sind. Unten folgt ein Tutorial, das ich auf ihrer Grundlage erweitert habe; es sollte die derzeit beste verfügbare Lösung sein.
1. Ausführbare Skripte
Beginnen wir mit dem einfachsten Fall.
Schreiben Sie zunächst ein ausführbares Skript namens hello mit JavaScript.
#!/usr/bin/env node
console.log('hello world');
Ändern Sie dann die Berechtigungen von hello.
$ chmod 755 hello
Jetzt kann hello ausgeführt werden.
$ ./hello hello world
Wenn Sie das Pfadpräfix vor hello entfernen möchten, können Sie den Pfad von hello zur Umgebungsvariable PATH hinzufügen. Ein besserer Ansatz ist jedoch, eine package.json im aktuellen Verzeichnis mit dem folgenden Inhalt zu erstellen.
{
"name": "hello",
"bin": {
"hello": "hello"
}
}
Führen Sie dann den Befehl npm link aus.
$ npm link
Wenn du hello jetzt erneut ausführst, musst du den Pfad nicht mehr eingeben.
$ hello hello world
2. Grundlegende Syntax für Kommandozeilenargumente
Kommandozeilenargumente können über die Systemvariable process.argv abgerufen werden.
#!/usr/bin/env node
console.log('hello ', process.argv[2]);
Beim Ausführen fügst du die Argumente einfach direkt nach der Skriptdatei hinzu.
$ ./hello tom hello tom
3. Prozesse erstellen
Skripte können über das child_process-Modul Kindprozesse erstellen, um Unix-Systembefehle auszuführen.
#!/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);
});
Die Verwendung ist wie folgt.
$ ./hello tom hello tom
4. Das shelljs-Modul
shelljsDieses Modul kapselt child_process neu, wodurch das Aufrufen von Systembefehlen bequemer wird. Es muss vor der Verwendung installiert werden.
npm install --save shelljs
Dann schreibe das Skript neu.
#!/usr/bin/env node
var name = process.argv[2];
var shell = require("shelljs");
shell.exec("echo hello " + name);
Der obige Code verwendet den lokalen Modus von shelljs, der Shell-Befehle über die exec-Methode ausführt. Es gibt auch einen globalen Modus, mit dem Shell-Befehle direkt im Skript geschrieben werden können.
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);
}
5. Das yargs-Modul
shelljs löst nur, wie man Shell-Befehle aufruft, während das yargs-Modul sich damit befasst, wie man Kommandozeilenargumente verarbeitet. Es muss außerdem installiert werden.
$ npm install --save yargs
Das yargs-Modul bietet ein argv-Objekt zum Lesen von Kommandozeilenargumenten. Bitte sehen Sie das umgeschriebene hello.
#!/usr/bin/env node
var argv = require('yargs').argv;
console.log('hello ', argv.name);
Bei der Verwendung funktioniert jede der folgenden beiden Verwendungsweisen.
$ hello --name=tom hello tom $ hello --name tom hello tom
Wenn Sie argv.name in argv.n ändern, können Sie die einbuchstabige Kurzform des Parameters verwenden.
$ hello -n tom hello tom
Sie können die alias-Methode verwenden, um anzugeben, dass name ein Alias für n ist.
#!/usr/bin/env node
var argv = require('yargs')
.alias('n', 'name')
.argv;
console.log('hello ', argv.n);
Auf diese Weise können sowohl kurze als auch lange Parameter verwendet werden.
$ hello -n tom hello tom $ hello --name tom hello tom
Das argv-Objekt hat eine Unterstrich-Eigenschaft (_), die Argumente abruft, die nicht mit einem Bindestrich beginnen.
#!/usr/bin/env node
var argv = require('yargs').argv;
console.log('hello ', argv.n);
console.log(argv._);
Die Verwendung ist wie folgt.
$ hello A -n tom B C hello tom [ 'A', 'B', 'C' ]
6. Konfigurieren von Kommandozeilenargumenten
Das yargs-Modul bietet auch 3 Methoden zum Konfigurieren von Kommandozeilenargumenten.
- demand: ob es erforderlich ist
- default: Standardwert
- describe: Hinweis
#!/usr/bin/env node
var argv = require('yargs')
.demand(['n'])
.default({n: 'tom'})
.describe({n: 'your name'})
.argv;
console.log('hello ', argv.n);
Der obige Code gibt an, dass der Parameter n nicht weggelassen werden kann, den Standardwert tom hat und eine Zeile mit Beschreibung bereitstellt.
Die Methode options ermöglicht es, all diese Konfigurationen in ein einziges Objekt zu schreiben.
#!/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);
Manchmal benötigen bestimmte Parameter keinen Wert und fungieren nur als Schalter. In diesem Fall können Sie die Methode boolean verwenden, um anzugeben, dass diese Parameter boolesche Werte zurückgeben.
#!/usr/bin/env node
var argv = require('yargs')
.boolean(['n'])
.argv;
console.log('hello ', argv.n);
Im obigen Code gibt der Parameter n immer einen booleschen Wert zurück. Die Verwendung ist wie folgt.
$ hello hello false $ hello -n hello true $ hello -n tom hello true
Die Methode boolean kann auch als Eigenschaft im options-Objekt geschrieben werden.
#!/usr/bin/env node
var argv = require('yargs')
.option('n', {
boolean: true
})
.argv;
console.log('hello ', argv.n);
7. Hilfeinformationen
Das Modul yargs bietet die folgenden Methoden, um Hilfeinformationen zu generieren.
- usage: Verwendungsformat
- example: stellt Beispiele bereit
- help: zeigt Hilfeinformationen an
- epilog: erscheint am Ende der Hilfeinformationen
#!/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);
Das Ausführungsergebnis ist wie folgt.
$ 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
8. Unterbefehle
Das yargs-Modul ermöglicht außerdem das Festlegen von Unterbefehlen im Git-Stil über die command-Methode.
#!/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);
Die Verwendung ist wie folgt.
$ hello morning -n tom Good Morning hello tom
Sie können diese Funktion mit dem shellojs-Modul kombinieren.
#!/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);
Jeder Unterbefehl hat oft seine eigenen Argumente, daher müssen Sie sie separat in der Callback-Funktion angeben. In der Callback-Funktion müssen Sie zunächst die reset-Methode verwenden, um das yargs-Objekt zurückzusetzen.
#!/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;
Die Verwendung ist wie folgt.
$ hello morning -m "Are you hungry?" Good Morning Are you hungry?
9. Sonstiges
(1) Rückgabewert
Nach Unix-Tradition gibt ein Programm bei Erfolg 0 zurück, andernfalls gibt es 1 zurück.
if (err) {
process.exit(1);
} else {
process.exit(0);
}
(2) Umleitung
Unix ermöglicht Programmen, Daten mithilfe von Pipes umzuleiten.
$ ps aux | grep 'node'
Skripte können umgeleitete Daten erhalten, indem sie auf das data-Event auf der Standardeingabe warten.
process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(data) {
process.stdout.write(data);
});
So wird es verwendet:
$ echo 'foo' | ./hello hello foo
(3) Systemsignale
Das Betriebssystem kann Signale an laufende Prozesse senden, und das process-Objekt kann Signal-Events überwachen.
process.on('SIGINT', function () {
console.log('Got a SIGINT');
process.exit(0);
});
Die Methode zum Senden von Signalen lautet wie folgt.
$ kill -s SIGINT [process_id]
Originalartikel: http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html