Für eine lange Zeit bestand mein Verständnis über ein Terminal in Unix-ähnlichen Systemen darin, dass es den Shell-Prozess startet und eine Benutzeroberfläche bereitstellt, indem es mit ihm über stdin , stdout & stderr kommuniziert .
Als ich mich kürzlich mit einem Problem beim Starten einer Windows-Konsolenanwendung über ein Cygwin-Terminal befasste, wurde mir klar, dass es möglicherweise nicht so einfach ist.
Unter http://cygwin.com/1.5/cygwin-ug-net/using-effective.html sehe ich,
Ein weiteres Problem besteht darin, Ausgaben von konsolenbasierten Windows-Programmen zu empfangen oder Eingaben an diese zu senden. Die Interaktion mit Windows-Konsolenanwendungen ist leider nicht einfach, wenn Sie ein Übersetzungsdienstprogramm verwenden. Windows-Konsolenanwendungen können unter command.com oder cmd.exe ausgeführt werden, und einige reagieren nicht ordnungsgemäß auf andere Situationen. Cygwin kann nur Konsolen-Eingaben empfangen, wenn es auch in einer Konsole (DOS-Box) ausgeführt wird, da Windows keine Möglichkeit bietet, eine Verbindung zum Backend des Konsolengeräts herzustellen. Eine andere traditionelle Unix-Eingabe- / Ausgabemethode, ptys (Pseudo-Terminals), wird von Cygwin unterstützt, jedoch nicht vollständig von Windows. Das Grundproblem besteht darin, dass eine Cygwin-Pty eine Pipe ist und es einigen Windows-Anwendungen nicht gefällt, wenn ihre Eingabe oder Ausgabe an Pipes umgeleitet wird.
Ich habe ein kleines C-Programm geschrieben, das ich unter Windows mit VC ++ 's cl.exe kompiliert habe -
#include <stdio.h>
int main(int argc, char *argv[]) {
#define BUFFER_LEN 1024
char buffer[BUFFER_LEN];
printf("echo server started\n");
while (fgets(buffer, BUFFER_LEN, stdin) != NULL) {
printf("%s", buffer);
}
return 0;
}
Wenn ich das Cygwin-Terminal ( mintty.exe ) starte und dieses Programm starte , kann ich nicht damit interagieren.
[puneet@freestyle ~]$ /cygdrive/c/echo1.exe
Hello
^ - keine Antwort
Aber wenn ich es in eine Pfeife stecke, funktioniert es -
[puneet@freestyle ~]$ echo -e "1\n2\n3" | /cygdrive/c/echo1.exe | while read line; do echo $line; done
1
2
3
[puneet@freestyle ~]$
Grundsätzlich kann es nicht mit dem Terminal mintty.exe interagieren . Wenn Sie jedoch bash.exe direkt von einer Windows-Konsole aus ausführen , kann die Interaktion korrekt erfolgen mit:
[puneet@freestyle ~]$ /cygdrive/c/echo1.exe
Hello
Hello
^Z
[puneet@freestyle ~]$
Ich dachte dann, wenn ich in meinen Computer ssh und dieses Programm als Befehl ausführen würde, würde es funktionieren, als würde das Terminal nicht direkt damit interagieren, aber der SSH-Server wird. Aber das geht auch nicht -
[puneet@freestyle ~]$ ssh freestyle /cygdrive/c/echo1.exe
Hello
^ - keine Antwort
Aber das in eine Pfeife zu stecken funktioniert wieder! -
[puneet@freestyle ~]$ echo -e "1\n2\n3" | ssh freestyle /cygdrive/c/echo1.exe | while read line; do echo $line; done
1
2
3
[puneet@freestyle ~]$
Könnte jemand die Theorie hinter all diesen Beobachtungen erklären?
Ist die Interaktion zwischen dem Terminal und der Shell mehr als nur die Verwendung von stdin , stdout und stderr der Shell ?
Wie unterscheidet sich die Windows-Konsole? Warum scheinen die Windows-Konsolenprogramme in einer Pipeline mit den Cygwin-Programmen gut zu funktionieren?
^D
nicht erreicht wirdecho1.exe
und was ein nicht emulierter Dateistream ist?