特にxとyがファイルの場合cat x y > y
。cat x >> x
「入力ファイルは出力ファイルです。」エラーが発生しない場合はどうなりますか?デフォルトでは、なぜこれらのコマンドを実行できないのですか?
答え1
cat x y > y
cp x y
y
(開始時間前に切り捨てられたため)と同じで、cat
その後にcat y >> y
。
cat x >> x
これは、ディスクがいっぱいになるか、ファイルシステムのファイルサイズ制限に達するまで無限ループになります(ファイルの末尾に追加し続け、再読み込みして再度追加するため)。
この「エラー」は、何もしなかったという意味ではなく、cat
特定のファイルをスキップしたという通知にすぎません(GNUでは、cat
少なくとも)。あなたはそれを実行することが「許可」されていますが、あなたが望むことをしないかもしれません。
このメッセージを生成するGNUテストは次のcat
とおりです。
- 出力(fd 0)は通常のファイルです。
- デバイス(フィールド)とinode(フィールド)は、出力fdとチェックしている入力ファイルと
st_dev
同じですst_ino
。 - 入力ファイルのオフセットはファイルサイズより小さいです(空ではありません。この時点でオフセットがゼロでない場合は考えられませんが、おそらく1つあります)。
これらのすべてが適用されたら、診断情報を印刷して次の入力ファイルに移動します。
コマンドの一部のバージョンはcat
このチェックを実行しないため、これが発生する可能性があります。私は彼らが確認したが同じファイルであると言うことはできませんでしたが、一番上から1つを話すことはできないシステムを想像できます。どちらにしても悪く終わることがあります。実装がメモリにマップされたファイル全体を一度だけ書き込むと、cat
ループの代わりにファイルが倍増する可能性がありますが、これはそれほど深刻ではありません。