実行中のスクリプトが奇妙な記号を表示しているときのコマンドライン入力


8

bashシェルcliを使用してすぐに返らないプログラムを実行すると、いくつかの文字を入力し(基本的に、前のコマンドが終了しなかったことに気づく前に次のコマンドを入力します)、入力は常に次のようになります(特に、上下矢印キー:)

]]A^ or ]]B^

とにかく、この種の時期尚早な入力はとにかく「有害」ですか、または返された文字列は何を意味していますか?


1
これはbashに固有のものではありません。そのタグを削除します。
Didi Kohen

回答:


8

これらの文字列は、入力した特殊文字(ホーム、エンド、矢印、タブなど)の生の表現です。
それらの有害な影響は、実行中のコマンドによって制御されます。ターミナルから入力を受け取っている場合、これらの文字はその入力の一部になります。
端末から入力を受け取らなければ、私が知っているUnixフレーバーのいずれにも悪影響を与えるべきではありません。


13

キーボードの一部のキーは、実際の文字に対応していません。たとえば、Aは文字に対応しますaが、UpおよびF1キーには独自の専用文字はありません。これらの特殊キーが押されると、端末はそのキーに対応する単一の文字を取得する代わりに、キープレスを、通常はエスケープ文字(通常はとして表示される^[)で始まる複数の文字の特殊なシーケンスに変換します。たとえば、Up通常はシーケンスを生成します^[[A(1つのキーから3文字です:エスケープ、、[およびA)。

通常表示されない理由^[[Aは、ほとんどのコンソールアプリケーションが、特別なシーケンスをコンソールにエコーするだけでなく、便利なコマンドに変換できるほどスマートであるためです。これを行うには、ターミナルの組み込みエコーをオフにし、独自の低レベル処理を行います。たとえば、をbash見ると^[[A、ユーザーが押したことを意味しUp、エコー^[[Aバックするのではなく、これまでに入力したものをすべて削除し、履歴に保存されている前のコマンドをフェッチして、代わりに印刷することを意味します。

^[[Aを押したときに表示される場合Upは、通常、ターミナルエコーがオンになっていて、フォアグラウンドプロセス(ターミナルを制御しているプロセス)が上記の特別な処理を実行していないことを意味します。これは、アプリケーションが(ほとんどの非対話型コマンドのように)単に端末を無視するためである可能性があります。通常、シェルは端末を標準モードにして、フォアグラウンドプロセスを実行する前にエコーをオンにし、コマンドの終了後に端末の制御を取り戻すと、独自の設定を復元します。

エコーはかなり無害のようです。実行中のコマンドが端末から読み取らない場合は、キーボードを介して生成した文字がbashの入力キューに入る可能性があるので、bash読み取りを再開すると通常のコマンドとして解釈されるため、入力する文字に注意してください。ターミナルから。

¹これは実際には単純化しすぎです。特定のシーケンスは端末タイプによって異なる可能性があるため、通常、コンソールアプリケーションと端末自体の間に抽象化ライブラリの複数の層があります。たとえばbashreadlineライブラリを使用してほとんどの入力を行います。


1
質問から私が理解したことから、ここでのケースは別のコマンドの実行中であり、プロセスの終了からbashが端末設定を復元するまでの銀時ではありませんでした。ただし、回答に必要な最低限の私の回答とは異なり、ケースを詳細に説明しているため、私はあなたの回答に賛成票を投じました。
Didi Kohen、2012年

@DavidKohen私はあなたが元の質問について正しいと思います。コマンドがまだ実行されている場合を考慮して、答えを少し調整しました。
jw013 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.