
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
。
答え2
私はこれが0x20以下のコードを持つ印刷できない文字のために主に起こると思います。バックスペース、削除などのキーの特殊制御/エスケープコードです。