Das Symptom ist, dass Cygwin process.stdin.on('data', cb);
und process.stdin.on('end', cb);
nicht aufgerufen wird.
Ich habe einen Workaround gefunden
Versionen
> ver
Microsoft Windows [Version 6.1.7601]
$ uname -a
CYGWIN_NT-6.1 localhost 1.7.28(0.271/5/3) 2014-02-04 16:01 x86_64 Cygwin
$ node --version
v0.8.14
Vielleicht funktioniert es mit einer neueren Node-Version, ich weiß es nicht, ich muss diese Version verwenden.
c:\test\myecho.js
console.error("Starting up");
process.stdin.resume();
process.stdin.setEncoding('utf8');
console.error("Warten auf Daten");
var inputContents = "";
process.stdin.on('data', function (chunk) {
process.stderr.write(".");
inputContents += chunk.toString();
});
process.stdin.on('end', function () {
console.error("\nAlles erhalten :)");
console.log(inputContents);
});
Probieren wir es auf Windows aus
c:\test>echo hello | node myecho
Starting up
Warten auf Daten
.
Alles erhalten :)
hello
c:\test>_
Probieren wir es in Cygwin aus
/cygdrive/c/test$ echo hello | node myecho
Starting up
Warten auf Daten
/cygdrive/c/test$ _
Probieren wir es nochmal "in Cygwin"
/cygdrive/c/test$ cmd /c 'echo hello | node myecho'
Starting up
Warten auf Daten
.
Alles erhalten :)
hello
/cygdrive/c/test$ _
Ok, machen wir es jetzt schick!
/cygdrive/c/test$ cmd /c 'echo hello | node myecho 2>NUL'
hello
/cygdrive/c/test$ cmd /c 'echo hello | node myecho' 2>/dev/null
hello
/cygdrive/c/test$ _
Schade, die Eingabe kann nicht über einen Cygwin-Dateideskriptor erfolgen, aber als Workaround ist es möglich, sie in eine Datei zu schreiben und sie dann zum Beispiel mit type
von dort auszulesen.
Portabilität
Wenn jemand ein portables Skript schreiben möchte, das ein Node-App aufruft, das Standardeingabe erwartet:
#!/bin/bash
SCRIPT_DIR='../Pfad/zu/Scripts' # absolute Pfade erfordern etwas mehr Spielerei
if [[ `uname -s` == CYGWIN* ]]; then
cmd /c "type file1 | node ${SCRIPT_DIR//\//\\}\program.js ${BASHVAR}" | grep stuff >file2
else
cat file1 | node ${SCRIPT_DIR}/program.js ${BASHVAR} | grep stuff >file2
fi