バイナリファイルでcatを使用したのはなぜ(そしてどのように)端末を台無しにしたのですか?


8

catマニュアルを正しく理解した場合:

ファイルを連結して標準出力に出力する

cat引数としてファイルを取り、標準出力に出力します。
私が得ないものは、私がコマンドを使用する場合です:

cat img.png > copy.png

2つの同じpngファイルを取得しますが、

cat img.png  

私の端末はめちゃくちゃになり、入力した文字を誤って解釈する可能性があります。

  • それはどうして可能ですか?
  • バイナリ値はバイナリデータのままです。なぜそれが一連​​の0と1を表示するのか、ASCIIでのこれらのバイナリデータの解釈を表示しないのか、または端末のエンコーディングが何であるのか?
  • この動作は、cat奇妙な文字を含むテキストファイルを使用することでも可能ですか?
  • try {} catch {}ステートメントのようなこの動作を防ぐメカニズムを実装する必要がありますか?

2
端末がめちゃくちゃにならない。制御文字を送り込んだ状態です。状態を変更した後でそれを使用できなくなったというのは、望んだことではないかもしれませんが、それは完全に、アクションの結果を理解していないためです。これは、ワードプロセッサで緑にあなたのフォントの色を切り替え、という理由だけで、あなたのワードプロセッサが台無しにされたと言うと同じになりますが、例えば、プログラムを終了せずに戻って黒のフォントにそれを切り替える方法がわかりません。
Anthon

4
resetコマンドは時々役立つかもしれないが、これは奇跡のソリューションではありません。
大木

入力する実際のシーケンスは、Control-JリセットControl-Jです。ほとんどの場合、正気を回復します。
Joshua

1
@ジョシュアそして、孤独resetresetCtrl-Jキーの間の違いは何ですか?私は何も見ることができません(より複雑な方法を
とる

1
端末がRAWモードのままになっている場合、EnterキーはCtrl-JではなくCtrl-Mを生成するため、シェルは行を終了してコマンドを実行するために必要なキーストロークを認識しません。
Joshua

回答:


8

cat コマンドラインで引数として指定されたファイルを標準出力に連結し、一度にバイトを読み取ります。デフォルトでは、読み取ったバイトの解釈は行われません。

最初の例では、stdoutをファイルにリダイレクトしているため、新しいファイルを取得します。

2番目の例では、バイトが端末に書き込まれ、文字シーケンスを端末の制御シーケンスとして解釈しているのが端末です。これが、端末で異常な動作が発生する理由です。そのcatようなものとは何の関係もありませんし、cat出力で何をしようとしているのかわかりません。パイプを介して別のプログラムに送信し、「雨の中で歌う」ことを解釈/処理/印刷または再生することができます。

したがって、unixの哲学に従い、

1つのことを行う、1つのことだけを行うが、それをうまく行う

cat あなたが何をしようとしているのかを推測し直してはいけません。

下記の@kiwyの最初のコメントへの返信1を編集してください。

はい、いいえ、説明させてください、

いいえ、できません。catターミナル(ターミナルソフトウェア)が出力を画面に送信したり、制御シーケンスを解釈したりするためです(古いハードウェア、つまりテレタイプデバイスをエミュレートしています)。

だが、

はい、パイプにキャットして、受信するプログラムが文字をコマンドとして解釈できる場合は可能です。

例としてこれを猫に見cat anyOldShellScript | bashなさい、bashはそれが得たものをコマンドとして解釈します。


これは、このcatようなプレーンテキストの命令に含まれている可能性のあるバイナリファイルrm -rf .が解釈される可能性があることを意味しますか?
Kiwy

D:私は本当に私はこれを取得するために管理することはありません私のキーボード上のアホのように入力する場合は、この意志のようにめちゃくちゃ取得することができ、なぜターミナル得ることはありませんが、私は答えを受け入れる
Kiwy

そして、皮肉なことに... hum
Kiwy

1
@Kiwy制御文字はキーボード上に存在しませんが、echo必要に応じて出力できます。その方法については、stackoverflow.com / questions / 5947742 / を、可能なことについては、termsys.demon.co.uk / vtansi.htmを参照してください
David Wilkins


2

これは主に、0x20未満のコードの印刷不可能な文字が原因で発生すると思います。それらは特殊な制御/エスケープコードで、Backspace、Deleteなどのキーに使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.