Załóżmy, że masz otwarty emulator terminala (T1) z PID 6350.
Z innego terminala wpisz polecenie (C1):
echo "ls\n" > /proc/6350/fd/0
To zapisuje ls
i nowy wiersz w T1, ale go nie wykonuje. Dlaczego?
Próbowałem również używać cat|bash
z, echo "ls\n" > /proc/catid/fd/0
ale nadal nie jest wykonywany.
Jak mogę powtórzyć polecenie w innym terminalu i wykonać polecenie?
możliwa odpowiedź :
$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;
W takim przypadku nie można już pisać bezpośrednio w terminalu (wszystko jest wyświetlane w ten sam sposób, co polecenie (C1) wyświetlało w tym terminalu.
terminal
stdout
command
file-descriptors
Rlandlander
źródło
źródło
Odpowiedzi:
Istnieje narzędzie wiersza polecenia,
ttyecho
które może wysłać polecenie do innego terminala (tty / pts) i wykonać polecenie.Zobacz: Narzędzie do wysyłania poleceń lub danych do innych terminali (tty / pts)
Zobacz także:
ttyecho
kod źródłowy na github .Innym interesującym poleceniem tty jest
selector
interaktywny dopasowywanie wzorców w czasie rzeczywistym w konsoli, które aktualizuje bufor wejściowy tty.Patrz: selektor - WYSZUKIWANIE DYNAMICZNE W KONSOLI
źródło
ttyecho
kodu źródłowego na github wydaje się być zepsuty. Jednak wydaje się , że teraz jest dostępny na github.com/osospeed/ttyecho .Po wydaniu zapisu do
/dev/pts/X
(/proc/6350/fd/0
,1
i2
jest po prostu dowiązaniem do tego), co się dzieje, jest dokładnie to samo, co się dzieje, gdy proces6350
(lub jednego z jego dzieci, odpowiednio rozwidlony) Wyjścia coś: to pisze do terminalu.Jeśli spróbujesz czytać z tego urządzenia (
cat < /dev/pts/X
), wydarzy się coś dziwnego. Powinieneś zobaczyć rzeczy, które wpisujesz w oryginalnej powłoce. (Całkiem możliwe, że dopiero po wpisaniu pierwszego nowego wiersza - Zgaduję, że program terminalowy (xterm
lub cokolwiek, którego używasz) wykonuje buforowanie linii, a6350
powłoka, która została zablokowana,read
pobiera ten kawałek; wtedy albo powłoka może, albo może nie, wygrywaj kolejne odczyty, ale równie dobrze mogę się mylić.)Chodzi o to, że kiedy czytasz lub piszesz na tym urządzeniu, nie rozmawiasz z inną powłoką, która go używa. Rozmawiasz z emulatorem terminala (
xterm
na przykład). Tylko emulator terminala może wstrzykiwać dane do tego kanału (co odczytuje powłoka), a wszystko, co powłoka zapisuje, trafia do terminala. Dołączenie drugiej powłoki tego nie zmienia.Jeśli chcesz wprowadzić polecenia do tego
6530
procesu, będzie musiał to zrobić za pośrednictwem terminala (niezależnie od tego, czy jest to aplikacja X11, czy coś innego).Zalecana lektura: Jaka jest dokładna różnica między „terminalem”, „powłoką”, „tty” i „konsolą”?
źródło
cat /dev/pts/x
nie potrzebujesz<
) otrzymuję litery ściśle na przemian między terminalami./proc/6350/fd/0
jest z prostym linkiem do standardowego elementu nadrzędnego,process 6350
którego terminalem jest. Myślę, że to samo dotyczy aplikacji okienkowych?