私はLinuxボックスにsshedし、dvtmとbashを使用しています(Gnu screenとbashでもこれを試しましたが)。現在の/ dev/pts/29と/ dev/pts/130の2つの端子があります。入力を一方から他方にリダイレクトしたい。
私が理解していることから、/ dev/pts/130に次のように入力できます。
cat </dev/pts/29
そして、/ dev/pts/29と入力すると、入力した文字が/ dev/pts/130に表示されます。ただし、最終的に発生するのは、入力した他のすべての文字がリダイレクトされることです。たとえば、「hello」と入力すると、次のようになります。
/dev/pts/29 | /dev/pts/130
$ | $ cat </dev/pts/29
$ el | hlo
Gdbで実行されているプロセスのioをリダイレクトするためにこれを行う必要があるため、これは本当にイライラします(/ dev/pts /#を実行し、劣ったtty/dev/pts /#を設定しようとしましたが、どちらも結果として前述の動作)。私は何か間違ったことをしていますか、それともこれはbash/screen/dvtmのバグですか?
単純化した例では、2つのプロセス(シェルとcat)がttyの「スレーブ」側から読み取ろうとしています。その結果、1つのプロセスが一部の文字を取得し、他のプロセスが他の文字を取得します。
「一方の[端子]からもう一方の[端子]に入力をリダイレクトする」とはどういう意味ですか?実際の状況では、どのプロセスが各端末から読み取ろうとしていますか?キャプチャした入力を取得したら、それをどのように処理しますか?何、正確に、あなたは実際に達成しようとしていますか?
私には、「gdbで実行されているプロセスのioをリダイレクトする」は、すでに実行されているプロセス内でstdin/stdout/stderrを再度開くように見えます。
実行中のプロセスのstdin/stdout/stderrは、( その他 )GDBを使用して変更できます。 「プロセスの開始後に、コマンドラインを使用してプロセスのSTDERR/STDOUTをリダイレクトしますか?」に対する回答 は、その方法を示しています。回答の/dev/null
をttyパス名に置き換え、stdinも処理したい場合がありますが、この手法は引き続き適用できます。
簡略化した例を確実に機能させることができるはずですが、実際にやりたいことを実行できるとは確信していません( 疑似端末 は実際には2つのようなデバイスのペアであることに注意してください)双方向パイプの端。ただし、すべての例では、「スレーブ」の半分と相互作用します)。
例を修正するための鍵は、競合するプロセスの1つを除いてすべてを取得して、端末からの読み取りを(一時的に)停止することです。あなたの例のように、データをキャプチャしたい側でシェルを実行している場合は、次のようなことができます。
(
s="$(stty -g)"
exec 3<&0
trap 'stty "$s" 0<&3;exit' 0 INT QUIT
cat <<EOM
In some other terminal, run the command
cat <$(tty)
Press ^C or ^\ to quit.
EOM
stty raw isig brkint susp '' dsusp ''
while true; do sleep 3600; done </dev/null
)