CTRL + Cの後でコンソールをリセットする必要があるのはなぜですか


9

一部のコマンドラインインターフェイスツールは、によってキャンセルされると、壊れたコンソールを返しますCTRL+C。コマンドが実行されるまで、テキストが表示されない場合や、グラフィックの問題が発生する場合がありますreset

(私はbashを使用していますが、シェルから独立していることを期待しています。)

この効果には名前がありますか?これは何が原因で、どのようにしてプログラマはツールでこれを防ぐことができますか?主要なプログラミング言語でこの問題に対処する方法はありますか?



stty sane灰色のひげのために
するThorbjörnRavnアンデルセン

回答:


14

いくつかのプロセス(たとえば、シェルによって開始されたプログラム)が終了しても、疑似端末の状態は変化しないため、コンソールにはreset(1) (またはいくつかのstty(1)コマンド)が必要になることがあります。

謎を解いttyを読んでください。

(私は疑似端末疑似端末の処理がLinuxの最も難しい部分だと思っています)

主要なプログラミング言語でこの問題に対処する方法はありますか?

端末を処理し、そのモードまたは回線規則を変更する適切に動作するプログラムは、クラッシュを回避し、適切な呼び出し(termios(3)を参照)を発行して、端末を正しい状態にする必要があります。ところで、ncursesreadlineなどのライブラリは役に立ちます(ただし、それらのクリーンアップルーチンを適切に呼び出す必要があります)。

signal(7)およびsignal-safety(7)を参照してください。コードのクラッシュを回避することは困難です。未定義の動作についてお読みください。

不完全な回避策としては、プログラムを実行してシェル関数を実行するシェル関数を定義することが考えられますreset(これは不適切な場合があります)。


その回避策は素晴らしいものではありません。時々reset異なるにつながることができstty、オリジナルのものからの設定。
ボブは、

はい、指摘していただきありがとうございます。「不完全」を追加しました。
Basile Starynkevitch 2017

私はあなたのリンクを読みました、それらは面白かったです、しかしあなたがこのQ / Aそれぞれのためにセクションへのポインターを追加することができれば役に立ちます。ttyを分かりやすく説明した後、私stty -a > /tmp/test1はbash から始めて、次にコマンドをキャンセルしました。ターミナルの色は赤になりました。stty -a > /tmp/test2しかしtest1test2まったく同じでした。
Jonas Stein

1

この問題への対応は、完全にシェルから独立しているわけではありません。zshにはttyctl、ttyモードを「フリーズ」または「フリーズ解除」できるビルトインがあります。bashに同等のものはないと思います。settytcsh のコマンドも同じことを行いますが、より細かい設定が可能です。個々の設定を凍結できます。

ttyモードをフリーズするということは、zshが現在のモードを記憶することを意味し、将来の子がそれを変更した場合、子が一時停止または終了したときにモードが復元されます。

これにより、クラッシュしたり端末のクリーンアップに失敗したりするプログラムの悪影響から保護されます。で変更したい場合は、フリーズを解除することを忘れないでsttyくださいstty。そうしないと、シェルは何をしたかをすぐに元に戻します。

reset復元sttyモード以外のことも行うので、時にはそれが必要になることもありますが、そうでない場合もあります。


確かに:btyでstty -a> / tmp / test1を開始してから、コマンドをキャンセルしました。ターミナルの色は赤になりました。stty -a> / tmp / test2ですが、test1とtest2はまったく同じでした。tcshでも同じことを試しましたが、CTRL + Cでコマンドをクラッシュさせることができませんでした。色は元のままでした。
Jonas Stein
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.