Unter Linux können Sie die Dateideskriptoren einer Anwendung als benannte Dateien in adressieren /dev/fd/[0-9]
. Und was Sie definitiv mit einer benannten Datei und einem Eingabestream tun können, ist tee
die Eingabe in diese Datei und in stdout. Und so , was ich in der Regel tun , wenn ich mich in Ihrer Situation (wie ich oft) ist tee
Eingang off sowohl auf meiner Leseanwendung und /dev/fd/2
- stderr.
So was:
seq 10 | tee /dev/fd/2 | wc -c
1
2
3
4
5
6
7
8
9
10
21
Selbst wenn Sie nicht auf einem Linux-System wären, könnte das Gleiche natürlich portabel gemacht werden - wenn auch in einigen Fällen weniger spezifisch - indem Sie es einfach tun ...| tee /dev/tty | ...
Wenn Sie über das Terminal sprechen, wenn Sie sagen stdin
(wie Ihr Link anzeigt) , können Sie immer noch dasselbe tun, obwohl es auf diese Weise aufgrund der Zeilenpufferung des Kernels etwas schwieriger werden kann. In diesem Fall würde ich also alle E tty
/ A- luit
Vorgänge protokollieren, indem ich meinen Befehl einpacke - weil ich es für die bequemere der beiden halte -, obwohl script
dies auch auf die gleiche Weise funktionieren könnte.
luit
ist wahrscheinlich bereits auf Ihrem System installiert - es ist normalerweise mit verpackt xterm
- und es ist ein sehr einfaches CLI-Tool, das für UTF-8-Übersetzungen vorgesehen ist (diese Funktion kann möglicherweise vollständig über den CLI-Schalter deaktiviert werden, aber ich habe nie einen Grund dafür gefunden dies tun) für Terminalanwendungen, die es nicht verstehen.
Es funktioniert, indem es seine eigene Pty - für die es den Master-FD besitzt - unter die aktuelle Tty-Ebene legt und alle E / A aus der aktuellen Sitzung in die untergeordnete Ebene kopiert, wo es Ihre angeforderte Anwendung ausführt. Da es das Master-Ende besitzt, kann es leicht alle E / A-Vorgänge duplizieren, die es an anderer Stelle liest / schreibt, wie es möchte, und es bietet eine bequeme Möglichkeit, es dazu aufzufordern:
luit -olog /dev/fd/2 sh -c 'read var; echo "$var"'
eecchhoo tthhiiss vvaarr??????
echo this var???
echo this var???
Wie Sie sehen können, werden luit
in der benannten -olog
Datei alle empfangenen Terminaleingaben protokolliert, sobald dies der Fall ist.
Die Verwendung /dev/fd/2
ist in diesem Fall bei weitem nicht so nützlich, da alle E / A-Vorgänge zweimal am selben Ort ausgeführt werden. Ich ziehe es in der Regel ein zweites Terminal zu öffnen, Abfrage seinen Namen mit dem tty
Befehl, und verwenden , die /dev/pts/[0-9]
Namen wie luit
/ script
‚s genannt outfile - die alle von der kopiert i / o an beide Anschlüsse gleichzeitig - so kann ich es auf der einen Lese- / Bewertung und interagieren mit ihm auf der anderen Seite. tee
kann in den meisten Fällen verwendet werden, um dasselbe zu tun, hat jedoch normalerweise nicht den Vorteil, dass das Master-Ende eines Pty es empfiehlt.
Wenn Ihr Ziel genau so ist, wie Sie es sagen - alle Eingaben eines Prozesses für Ihre Überprüfung zu kopieren -, sollten Sie sich wahrscheinlich am besten auf die Eingaben konzentrieren. strace
Dies ist für viele Dinge nützlich. Wenn Sie jedoch versuchen, einen genauen Bericht über das typische Verhalten zu erhalten, sollten Sie dieses Verhalten beim Sammeln Ihres Berichts wahrscheinlich so wenig wie möglich ändern. Mit anderen Worten, wenn Sie eine Eingabe wünschen, kopieren Sie die Eingabe, fügen Sie keinen übergeordneten Debugging-Prozess ein, der -TRAP
Ihren Prozess jedes Mal anhält, wenn er einen Systemaufruf ausführt.