web-dev-qa-db-ja.com

ある端子から別の端子に入力をリダイレクトする

私は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のバグですか?

7
Niki Yoshiuchi

単純化した例では、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
)
8
Chris Johnsen