web-dev-qa-db-ja.com

Linuxターミナル:入力フィードバックが消え、改行が表示されない

時々、コマンドラインツール(a Python script)を実行する必要があります。この出力により、端末が壊れているようです。実行が終了すると、入力フィードバックがなくなります(できます)これは、端末がPuTTYを介してリモートで起動された場合、およびgnome-terminalを使用している場合はローカルで起動された場合に発生します。

たとえば、問題が発生した後、次のように入力すると ENTER pwd ENTER、私は見ると期待しています:

[userA@Host006 ~]$
[userA@Host006 ~]$ pwd
/home/userA
[userA@Host006 ~]$

しかし、実際の出力は次のとおりです。

[userA@Host006 ~]$ [userA@Host006 ~]$ /home/userA
                                                             [userA@Host006 ~]$

それを修正する唯一の方法は、その端末を閉じて新しい端末を起動することです。

関連する可能性があります:スクリプト出力には、端末ベースの書式設定が含まれています(たとえば、フォアグラウンド/バックグラウンドを反転して、いくつかのステータスメッセージを強調表示します)。この出力をファイルにダンプすると、[07mSome Message Here[0mなどが表示されます。

これを防ぐために私ができることはありますか?

45
E.Z.

コマンドresetを実行すると、ターミナルが復元されます( reference )。

この問題は一般に、バイナリデータを端末にダンプするときに発生しますSTDOUT。受信したエスケープコードが処理されると、テキストの色の変更、エコーの無効化、文字セットの変更まで何でもできます。

これを回避する簡単な方法は、不明なバイナリデータを端末にダンプしないようにし、それを16進数に変換して端末の設定を変更しないようにすることです。

97
Joshua Briefman

Joshua Briefman's answer を詳しく説明するには、reset -cは、問題の原因となった制御文字のみをリセットします。

tsetreset-端末の初期化

Usage: tset [options] [terminal]

Options:
  -c          set control characters
  -e ch       erase character
  -I          no initialization strings
  -i ch       interrupt character
  -k ch       kill character
  -m mapping  map identifier to type
  -Q          do not output control key settings
  -r          display term on stderr
  -s          output TERM set command
  -V          print curses-version
  -w          set window-size

また、コマンドの manual の次の形式に注意してください。

注、入力する必要がある場合があります

<LF>reset<LF>

(改行文字は通常control-Jです)端末を動作させるには、キャリッジリターンが異常な状態で動作しなくなる可能性があります。また、端末はしばしばコマンドをエコーし​​ません。

6
Bas Peeters