web-dev-qa-db-ja.com

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

catマニュアルを正しく理解している場合:

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

catはファイルを引数として取り、それらを標準出力に出力します。
次のコマンドを使用すると、取得できないものがあります。

cat img.png > copy.png

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

cat img.png  

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

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

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

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

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

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

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

catは、何をしようとしているのかを二度と推測しようとしてはなりません。

以下の@kiwyの最初のコメントへの返信1を編集します。

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

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

だが、

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

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

8
X Tian

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

2
UVV