閉じられていないIOリソースは、次のシェルプロンプトで入力を妨げる可能性があります。

閉じられていないIOリソースは、次のシェルプロンプトで入力を妨げる可能性があります。

場合によっては、子プロセス(Rubyスクリプトなど)を生成するターミナルプログラムを実行しても、子IO.popenプロセスのIOハンドルが正しくクリーンアップされていない場合(たとえばIO.close)、プログラムが終了し、新しいシェルプロンプトが表示されたときにターミナル入力が正しく機能しないそうです。

たとえば、矢印キーとメタキーまたはCtrlキーはキーストロークを変更して設定されたキーバインディングをトリガーするのではなく、エスケープシーケンス(たとえば^[<key>)がターミナルプロンプトに出力されます。たとえば、<M-o>3回クリックすると次のようになります。

$ ^[o^[o^[o

この状態でキーを押すと、<C-c>この問題のない新しいプロンプトが生成されます。そのため、以前のプロセスが終了したときにIOリソースが閉じられず、端末が奇妙な状態にあるようです。誰かが正確に何が起こっているのかを説明できますか?

答え1

これはxtermとbashのように聞こえます。これ基本的なbash設定メタモードが設定され、一部のプログラムはオフにし(両方ともエスケープシーケンスを介して)、bashに組み込まれているリセットを介して復元します。

次の結果を送信すると、必要な方法で動作させることができます。

tput smm

プロンプト文字列に(一般的に注意するのは、文字列を囲む必要があり、\[bash\]に文字列の「幅」を無視するように指示することです)。

関連情報