バイナリファイルでcatを使用すると、なぜ(そしてどのように)端末がめちゃくちゃになるのですか?

バイナリファイルでcatを使用すると、なぜ(そしてどのように)端末がめちゃくちゃになるのですか?

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

ファイルをリンクして標準出力として印刷

catファイルを引数として標準出力に出力します。
私が理解していないのは、次のコマンドを使用することです。

cat img.png > copy.png

私は2つの同じpngファイルを取得します。一方、もし私が

cat img.png  

私の端末が歪んでいるので、入力した内容を誤って解釈する可能性があります。

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

ベストアンサー1

catコマンドラインに引数として指定されたファイルをリンクし、リンクされた出力を標準出力に出力します。これは、バイトを読み取り(概念的に一度に1つずつ)、デフォルトで読み取ったバイトの解釈を実行しません。

最初の例では、stdoutをファイルにリダイレクトするため、新しいファイルが作成されます。

第2の例では、バイトが端末に書き込まれ、これは次のようになる。端末つまり、文字シーケンスは端末の制御シーケンスとして解釈される。これが端末で奇妙な動作が発生する理由です。以下とは関係ありませんcat それ自体。  cat出力で何をするのかよくわかりません。解釈/処理/印刷するために別のプログラムにパイプすることも、「Singin' in the Rain」を再生するためにオーディオドライバに渡すこともできます。

したがって、Unixの哲学に従ってください。

1つだけしなさい、1つだけがうまくいく

cat自分がやろうとしていることを推測したり説明したりしないでください。


~から@Kiwyさんのコメントは次のとおりです(構文に対して修正済み):

catバイナリにこのようなプレーンテキスト命令が含まれていると解釈できるという意味ですかrm -rf

はい、いいえ。説明します。

いいえ:cat端末(ターミナルソフトウェア)が画面に出力を送信したり制御シーケンスを解釈したりするため、端末を使用している場合(たとえば、古いハードウェアをエミュレートしています)。テレタイププライター)。

しかし、:

例:catパイプを使用し、受信プログラムが文字をコマンドとして解釈できる場合。

この例を見てください。

cat anyOldShellScript | bash

この例では、bash取得した内容がコマンドとして解釈されるため、rm -rfパイプに渡された内容に文字がある場合はその文字が実行されますcat

おすすめ記事