web-dev-qa-db-ja.com

入力ファイルを出力ファイルにできないのはなぜですか?

特にcat x y > ycat x >> xの場合、xとyはファイルです。

「入力ファイルが出力ファイルです」というエラーが表示されなかった場合はどうなりますか?基本的に、なぜこれらのコマンドを実行できないのですか?

2
Rabbit

cat x y > ycp x yと同じです(ycatが開始するまでに切り捨てられるため)cat y >> yが続きます。

cat x >> xは、ディスクがいっぱいになるか、ファイルシステムのファイルサイズの制限に達するまで無限ループになります(ファイルの最後に追加し続け、再度読み込んで再度追加するため)。

この「エラー」は、catが何もしなかったことを意味するわけではないことに注意してください。これは、この特定のファイルがスキップされたことを通知するだけです( in GNU cat、少なくとも )あなたはそれを実行することを「許可」されています、おそらくあなたが望んでいたことを実行しなかっただけで、それはあなたに知らせています。

そのメッセージを生成するためのGNU catのテストは次のとおりです。

  1. 出力(fd 0)は通常のファイルです。そして
  2. デバイス(st_devフィールド)とiノード(st_inoフィールド)は、出力fdと検査中の入力ファイルの両方で同じです。そして
  3. 入力ファイルのオフセットがファイルのサイズよりも小さい(空ではない。この時点でオフセットがゼロにならない場合は考えられないが、おそらく1つある)。

これらすべてが当てはまる場合、診断が出力され、次の入力ファイルに進みます。

catコマンドの一部のバージョンはこのチェックを行わず、これらのことを実行できます。私は彼らがチェックを行うシステムを想像できます、そしてそれは彼らが同じファイルであることを同様にあなたに言うことができませんが、私はあなたの手でそれをあなたに言うことができませんでした。どちらの場合でも、それはおそらくひどく終わります。 cat実装がメモリマップファイル全体の単一の書き込みのみを行う場合、ループではなく、ファイルが2倍になるだけで終了する可能性がありますが、それはそれほどひどいものではありません。

3
Michael Homer