Ich habe eine Python-Programmdatei, die von jemand anderem geschrieben und kompiliert wurde und die ich einfach einmal in der Mitte meines eigenen Bash-Skripts ausführen muss. Das Programm verwendet eine textbasierte Benutzeroberfläche und wartet daher auf Eingaben, bevor es fortfährt, aber die Tastenoperationen, die es beim Start ausführt, sind in meinem Bash-Skript erforderlich. Ich weiß, das ist ein chaotisches (und seltsames) Verfahren, aber leider habe ich keine anderen Optionen.
Ich bin um das zwangsweise Schließen des Programms mit einem Kill-Signal herumgekommen, aber die TUI des Programms besteht darauf, die Ausgabe dorthin zu senden, wo es ausgeführt wird. Ich habe versucht, sowohl stdout als auch stderr nach /dev/null umzuleiten und das Programm im Hintergrund laufen zu lassen, indem ich ein Et-Zeichen angehängt habe, aber ich bekomme es einfach nicht zum Laufen. Ich glaube, die Ursache ist, dass das Programm andere Prozesse startet und die Ausgabeumleitung des übergeordneten Prozesses diese nicht beeinflusst. Gibt es einen Trick, mit dem ich auch die gesamte Ausgabe von untergeordneten Prozessen umleiten kann?
Antwort1
Das Programm schreibt möglicherweise auf das TTY statt auf die Standardausgabe. Möglicherweise können Sie das unbuffer
mitgelieferte Skript verwenden.expect
oder eine andere Technik expect
oder etwas Ähnliches verwenden.
Hier ist eine Demonstration. Erstellen Sie dieses Skript und nennen Sie es „writetty“. Dann führen Sie Folgendes aus chmod u+x writetty
:
#!/bin/bash
date > /dev/tty
Probieren Sie es jetzt aus:
$ ./writetty
Tue Jun 8 12:24:36 CDT 2010
$ ./writetty > /dev/null
Tue Jun 8 12:24:46 CDT 2010
$ var=$(./writetty)
Tue Jun 8 12:24:56 CDT 2010
$ unbuffer ./writetty > /tmp/writetty.out
$ cat /tmp/writetty.out
Tue Jun 8 12:25:06 CDT 2010
$ var=$(unbuffer ./writetty)
$ echo $var
Tue Jun 8 12:25:16 CDT 2010
Sie können verwenden expect
, um auf die Eingabeanforderung des Programms zu reagieren, anstatt es zu beenden.