こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

UNIX: catコマンドで無限ループ???

正確にはOS X 10.9.5のbashですが、UNIX一般の質問と思われるのでこのようなタイトルにしました。
catコマンドで、あるテキストファイルのあとに、同じテキストファイルをつくろうと思いましたが、無限ループになってしまい、巨大ファイルができてしまいます。

最初、このようにしてa.txtという1行のファイルを作りました。

 [~]$ cat > a.txt
 aaa

それで、同じa.txtを

 aaa
 aaa

という2行のファイルにしたいと思い、以下のようなコマンドを入力しました。

[~]$ cat a.txt >> a.txt

自分の目論見としては、a.txtの内容がa.txtに追加されるので、2行になるかと思いましたが、応答がなくなりました。
Ctrl+Cで停止し、a.txtの内容を見ると

[~]$ cat a.txt
aaa
aaa
aaa
aaa
aaa
aaa
・・・・・・

と何千行も入っています。
ファイルのサイズはこれぐらいでした。

[~]$ ls -al a.txt
-rw-r--r-- 1 TYWalker staff 16898724 9 22 12:57 a.txt

これは、なぜこのような現象になるのでしょうか。
また、私が本来やろうとしたことを、簡単なコマンドで行うにはどうすればいいでしょうか。
よろしくお願いします。

投稿日時 - 2014-09-22 13:05:22

QNo.8763813

すぐに回答ほしいです

質問者が選んだベストアンサー

cat a.txt >> a.txt とすると、
まず現在のa.txtの内容を読み出し、a.txtに追記されます。
すると、
aaa\n (←次はここから読み込まれる)(catにより、追加されている→) aaa\n
となります。ファイルには続きがあるので、それが読み込まれてa.txtに追記されます
aaa\naaa\n (←次はここから読み込まれる)(上の続きで追加されている→) aaa\n
まだファイルの続きがあるので読み込まれて追記されます.以下同様

これが延々と続く理由です。


出力を別のファイルにするとか
cat a.txt a.txt > b.txt
別のファイルにコピーしてから追記するとか
cp a.txt c.txt
cat c.txt >> a.txt

投稿日時 - 2014-09-22 23:11:35

お礼

ありがとうございます!
納得いきました!

投稿日時 - 2014-09-28 08:01:59

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

sed 2q a.txt >> a.txt
でできちゃったりして.

投稿日時 - 2014-09-23 00:25:57

お礼

sedですか。これもかっこいいですね!
ありがとうございます!

投稿日時 - 2014-09-28 08:01:54

ANo.1

ぱっと思いつくものは標準出力経由での書き込み

cat a.txt | tee -a a.txt

投稿日時 - 2014-09-22 13:29:08

お礼

ありがとうございます!

投稿日時 - 2014-09-28 08:00:49

あなたにオススメの質問