猫のリダイレクト


11

というファイルabcが現在のディレクトリに存在し、その中にテキストが含まれているとします。コマンドを実行すると:

cat abc > abc

ファイルの内容を実行する理由 abc消えるのですか?
コマンドがその中のテキストを削除し、ファイルが空のファイルになるのはなぜですか?



10
レーザーポインターは、非常に有効なツールである猫のリダイレクト。 </ pun>
WBT 2016

私の猫はリダイレクトへの反応が非常に悪い...
Ex Umbris

この問題を回避するために、私はと呼ばれる小さなシェルスクリプトを使用cat abc | dog abc
joeytwiddle

画面上の出力を気にしない場合のもう1つのオプションは、を使用することteeです。
Andrea Lazzarotto 2016

回答:


27

物事が行われる順序のために。

あなたがするとき:

cat abc > abc

>出力リダイレクト演算子です。シェルがこれを検出すると、ieのO_TRUNCフラグを使用してファイルを切り捨てモードで開きます。そのため、ファイル内にあったものはすべて失われます。このリダイレクトは、コマンドが実行される前にシェルによって最初に行われることに注意してください。open(2)open("abc", O_TRUNC)cat

したがって、コマンドを cat abc実行すると、ファイルabcは既に切り捨てられているためcat、ファイルは空になります。


1
猫abc >> abcはどうですか?次に何が起こりますか?
トゥルシーカノディア

2
@TulsiKanodia-それは無限ループを引き起こします。猫は行を読むたびに、次の行に移動する前に別の行を追加します。
user3490

3
これは検出され、防止されます。代わりに、テキストcat: filename: input file is output file(ここでfilename選択したファイル名)は古いstdoutに印刷されます。
UTF-8

@TulsiKanodia unix.stackexchange.com/questions/154903/why-does-cat-xx-loopを参照してください
Gilles 'SO- stop

5

@heemaylの回答に追加して、発生しているシーケンスについてコードをより明確にしたい場合は、コマンドの先頭にリダイレクトを置くだけです。

> abc cat abc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.