Angenommen, Sie haben einen Terminalemulator (T1) mit einer PID von 6350 geöffnet.
Geben Sie an einem anderen Terminal diesen Befehl ein (C1):
echo "ls\n" > /proc/6350/fd/0
Dies schreibt ls
und die neue Zeile in T1 führt sie aber nicht aus. Warum?
Ich habe auch versucht, cat|bash
mit zu verwenden, echo "ls\n" > /proc/catid/fd/0
aber es wird immer noch nicht ausgeführt.
Wie kann ich den Befehl in ein anderes Terminal übertragen und ausführen lassen?
mögliche Antwort :
$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;
In diesem Fall können Sie nicht mehr direkt in das Terminal schreiben (alles wird so angezeigt, wie der Befehl (C1) es in diesem Terminal angezeigt hat.
terminal
stdout
command
file-descriptors
rvlander
quelle
quelle
Antworten:
Es gibt ein Befehlszeilenprogramm
ttyecho
, das einen Befehl an ein anderes Terminal (tty / pts) senden und den Befehl ausführen lassen kann.Siehe: Dienstprogramm zum Senden von Befehlen oder Daten an andere Terminals (tty / pts)
Siehe auch:
ttyecho
Quellcode auf Github .Ein weiterer interessanter tty-Befehl ist
selector
ein interaktiver Echtzeit-Mustervergleich in der Konsole, der den tty-Eingabepuffer aktualisiert.Siehe: Selektor - DYNAMISCHE SUCHE IN KONSOLE
quelle
ttyecho
scheint der Link zum Quellcode auf Github unterbrochen zu sein. Es scheint jedoch jetzt stattdessen unter github.com/osospeed/ttyecho verfügbar zu sein .Wenn Sie eine Schreib auszustellen
/dev/pts/X
(/proc/6350/fd/0
,1
und2
ist nur ein symbolischer Link auf das), was passiert ist , genau die gleiche Sache , die , wenn Prozess geschieht6350
(oder eines seiner Kinder, in geeigneter Weise gegabelt) gibt etwas: es an das Terminal schreibt.Wenn Sie versuchen, von diesem Gerät ( ) zu lesen ,
cat < /dev/pts/X
passieren funky Dinge. Sie sollten sehen, dass die Dinge, die Sie in die ursprüngliche Shell eingeben, angezeigt werden. (Möglicherweise erst nach der ersten neuen Zeile, die Sie eingegeben haben - ich vermute, das Terminalprogramm (xterm
oder was auch immer Sie verwenden) führt eine Zeilenpufferung durch, und die6350
Shell, auf der blockiert wurde,read
erhält dieses Teil; dann kann entweder die Shell oder möglicherweise nicht, gewinne die nachfolgenden Lesungen, aber ich könnte sehr wohl völlig falsch liegen.)Die Sache ist: Wenn Sie von diesem Gerät lesen oder darauf schreiben, sprechen Sie nicht mit der anderen Shell, die es verwendet. Sie sprechen zum
xterm
Beispiel mit dem Terminalemulator . Nur der Terminalemulator kann Daten in diesen Kanal einspeisen (was die Shell liest), und alles, was die Shell schreibt, geht an das Terminal. Das Anbringen einer zweiten Shell ändert daran nichts.Wenn Sie Befehle in diesen
6530
Prozess einfügen möchten, muss dies über das Terminal erfolgen (unabhängig davon, ob es sich um eine X11-App oder etwas anderes handelt).Empfohlene Lektüre: Was ist der genaue Unterschied zwischen einem "Terminal", einer "Shell", einem "tty" und einer "Konsole"?
quelle
cat /dev/pts/x
Sie nicht brauchen<
) die Buchstaben streng abwechselnd zwischen den Terminals./proc/6350/fd/0
ist ein Simlink zu dem stdin-Elternteil,process 6350
dessen Terminal ein Terminal ist. Ich denke, es ist das gleiche für Anwendungen mit Fenster?