一般的な対話型Pythonセッションを実行すると、入力/出力は次のようになります。
>>> 1 + 1;
2
これで実行しようとしているので、socat
「サーバー」を起動します。
socat UNIX-LISTEN:$HOME/socket,fork EXEC:python,pty,stderr
他の端末から接続します。
socat - UNIX-CONNECT:$HOME/socket
入力が再びエコーされることを除いて、ほぼうまく機能します。
>>> 1 + 1;
1 + 1;
2
どうやってドラッグできますか?echo=0
私がしたいことをしません。これにより、入力したときに入力内容が非表示になり、あまり役に立ちません。一般的なインタラクティブセッションのように機能したいです。
(Pythonとローカルドメインソケットを使用するのは1つの例です。他のプログラム(cat、luaなど)や他のソケットタイプ(TCPソケットなど)でも同様です。
答え1
クライアント側でこれを作成します。気づく「生の」。
socat unix-connect:socket -,raw,echo=0
またはこれサービス端末。 「エコ=0」をご覧ください。
socat unix-listen:socket exec:"python",pty,echo=0
しかし、両方ともできません。あるいは、クライアントstdioでrawを使用し、サーバーptyでecho = 0を使用すると機能しますが、echo = 0を2回適用しないでください。
1+1 2つのことを見てみましょう。彼らはエコーですが、異なる意味を持っています。最初のエコーはクライアントのラインバッファから出て、2番目のエコーはsocatによって生成されたサーバー側ターミナルから来ます。
>>> 1 + 1;
1 + 1;
2
クライアントstdioでecho = 0のみを使用すると、socatはstdioバッファのエコー(画面表示)を無効にするように制御端末(xtermなど)に通知するため、最初の1 + 1が消え、2番目の1 + 1が表示されます。キーを押しました。サーバーptyのecho = 0は、socatが受信した入力をクライアントに再エコー(ping)するのを防ぎ、2番目の1 + 1が消えます。そして生のクライアントではstdioのバッファリングが無効になっているため、各キーは戻り値がサーバーに送信されるのを待たず、サーバーはすぐにキーをエコーします。。クライアント stdio では raw を使用し、クライアント stdio では echo=0 を使用します。キーを押すと、最初にキーがサーバーに送信され、サーバーはそれを再送信してクライアントに表示します。クライアントstdioでrawを使用し、サーバーptyでecho = 0を使用すると、キーが押されたときにサーバーに送信されると同時に表示されますが、再送信されません。
コマンドライン編集の場合は、クライアント側で1行をバッファリングし、その行編集が完了するまで行全体を送信しないだけで十分です。ただし、強力なスマートコンプリート機能が必要な場合は、サーバー側の参加が必要です。