質問: ある端子から別の端子に入力をリダイレクトする 私は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 )