スクリプトを実行すると、コマンドライン入力に奇妙な記号が表示される

スクリプトを実行すると、コマンドライン入力に奇妙な記号が表示される

bashシェルcliを使用してすぐに返されないいくつかのプログラムを実行すると、いくつかの文字を入力します(基本的に前のコマンドが完了していないことを知る前に次のコマンドを入力します)、入力は常に次のようになります(具体的にUpを使用するときに下矢印キーを使用してください:)

]]A^ or ]]B^

とにかく、この早期入力が「有害」なのか、それとも返された文字列が何を意味するのか疑問に思います。

ベストアンサー1

キーボードの一部のキーは実際の文字と一致しません。たとえばAaキーには一意の専用文字はありません。これらの特殊キーを押すと、端末はそのキーに対応する単一の文字を取得せずに、代わりにキーストロークを通常エスケープ文字で始まる複数の文字の特殊シーケンス(通常はマークされている)に変換します。たとえば、シーケンス(つまり、キーの3文字:エスケープと)を生成するのが一般的です。 UpF1^[Up^[[A[A

一般に、このコンテンツが表示されない理由^[[Aは、ほとんどのコンソールアプリケーションが特別なシーケンスをコンソールに表示するのではなく、便利なコマンドに変換するのに十分スマートなためです。端末の内蔵エコーをオフにし、それ自体が低レベルの処理を実行してこれを行います。たとえば、コマンドは時ですbash報告^[[AUp^[[A

^[[Aこのメッセージが時間通りに表示されると、通常はターミナルUpエコーがオンになり、フォアグラウンドプロセス(ターミナルを制御するプロセス)が上記の特別な処理を実行しないことを意味します。これは、アプリケーションが単に端末を無視するためです(ほとんどの非対話型コマンドと同様)。通常、シェルはターミナルを正式モードに切り替え、フォアグラウンドプロセスを実行する前にエコーをオンにし、コマンドが終了した後にターミナルコントロールを再取得し、独自の設定を復元します。

エコはかなり無害なようです。実行中のコマンドが端末から読み込まれないと、キーボードで生成された文字がbash入力キューに入る可能性があるため、bash履歴書を読むと解釈される可能性があるため、入力する内容に注意してください。端末で一般的な注文の場合。

1これは実際に過度に単純化されたものです。正確な順序は端末の種類によって異なるため、コンソールアプリケーションと端末自体の間に複数の階層の抽象化ライブラリがあることがよくあります。たとえば、ライブラリをbash使用してreadlineほとんどの入力を実行します。

おすすめ記事