PID 6350を使用して端末エミュレータ(T1)を開くとしましょう。
別の端末(C1)で次のコマンドを入力します。
echo "ls\n" > /proc/6350/fd/0
これにより、ls
T1 に新しい行が書き込まれますが、実行されません。なぜ?
cat|bash
私もwithを試してみましたが、echo "ls\n" > /proc/catid/fd/0
まだ実行されていません。
コマンドを他の端末にエコーしてコマンドを実行するにはどうすればよいですか?
考えられる答え:
$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;
この場合、端末に直接書き込むことはできません(すべては、コマンド(C1)がその端末に表示するのと同じ方法で表示されます。
答え1
ttyecho
他の端末(tty / pts)にコマンドを送信し、そのコマンドを実行できるコマンドラインユーティリティがあります。
sudo ttyecho -n /dev/pts/5 ls
望むより:コマンドまたはデータを別の端末に送信するユーティリティ(tty / pts)
また見なさい:ttyecho
githubのソースコード。
もう一つの興味深いttyコマンドは、selector
tty入力バッファを更新するコンソールのリアルタイムインタラクティブパターンマッチングです。
# selector examples
selector -v -x @ <(find . -maxdepth 2 -type d | awk '{print $0"@cd "$0}')
selector -v -x @ <(grep -E -o 'http[^ ]+' fileWithURLS)
望むより:セレクタ - コンソールの動的検索
答え2
/dev/pts/X
/proc/6350/fd/0
(、1
対応するシンボリックリンクのみ)への書き込みを実行すると、2
プロセス(または適切に分岐したサブプロセスの1つ)が何かを出力したときに発生するのとまったく同じです6350
。つまり、端末に書き込みます。
試してみると読むそのデバイス(cat < /dev/pts/X
)で奇妙なことが起こります。元のシェルに入力した内容が表示されます。 (ほとんど最初の新しい行を入力した後にのみ可能です。ターミナルプログラム(xterm
または使用中のプログラム)がいくつかの行バッファリングを実行し、ブロックされたシェルがその6350
部分を取得するread
ようです。そうではないかもしれません。
問題は、デバイスが読み書きするときにデバイスを使用する他のシェルと通信しないことです。たとえば、端末エミュレータと話していますxterm
。端末エミュレータだけがこのチャネルにデータ(シェルから読み取ったデータ)を挿入できます。シェルで作成した内容はすべて端末に送信されます。 2番目のシェルをインストールしても、この内容は変わりません。
プロセスにコマンドを挿入するには、6530
ターミナル(X11アプリケーションでも何でも)を介して実行する必要があります。