2 Stimmen

`Nodejs process.stdin.resume()` funktioniert nicht in Cygwin

Versuche, ein CLI-Programm zu erstellen - warte auf Benutzereingabe. In Cygwin beendet sich das Skript einfach. Nur das im Skript process.stdin.resume()

Scheint auf einer Linux-VM zu funktionieren. Funktioniert auch in der Windows-Eingabeaufforderung.

Ich gehe von 'Terminal'-Angelegenheiten in Bezug auf Cygwin aus.

2voto

TWiStErRob Punkte 41031

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X