Чому ця команда створює надзвичайно великий файл?


19

Я сьогодні експериментував з деякими операціями додавання і, з цікавості, запустив це (де file1.txt було не порожнім, а file2.txt порожнім):

$ cat file1.txt >> file2.txt >> file1.txt

Коли я побачив, що це проходить деякий час, я натиснув Ctrl+, Cщоб закінчити його. На той момент файл1.txt був розміром сотні Мб.

Перемикання імен файлів не дає однакового ефекту; лише коли файли в такому порядку, відбувається нескінченне перенаправлення. Що саме відбувається, що викликає це?

Відповіді:


24

Ви не можете сказати, catщоб використовувати декілька стандартних таким чином, останнє перенаправлення має перевагу таким чином:

cat file1.txt >> file2.txt >> file1.txt

еквівалентно:

>> file2.txt ; cat file1.txt >> file1.txt

що, очевидно, швидко заповнює файлову систему, враховуючи той факт, що вихідний файл, який є пунктом призначення, також зростає на невизначений термін file1.txt, достатньо великий, щоб його не можна було прочитати одразу.

Більшість сучасних catреалізацій повинні виявити рекурсивність та перервати:

Кіт Соляріс:

cat: input/output files 'file1.txt' identical

Gnu cat:

cat: file1.txt: input file is output file

Їх можна все-таки обдурити чимось на зразок:

cat < file1.txt | cat | cat  >> file2.txt >> file1.txt

Приємне не настільки марне використання котів ...


19
Це багато котів, мяу.
slm

2
Ти змусив мене крутити голову, але ти відповів на моє запитання!
Метт

7
І коли я запитав про це в Google+ (не отримав відповіді), він автоматично позначив мій пост на #Cat та #Caturday
Метт

3

Я не зміг відтворити це в оболонці Баша:

# non-empty file1
$ echo 1 > file1.txt

$ cat file1.txt >> file2.txt >> file1.txt 
cat: file1.txt: input file is output file

1 файл створюється довжиною 0, але тоді я отримую вищезгадане повідомлення:

$ ls -l
total 4
-rw-rw-r-- 1 saml saml   2 Sep 10 19:35 file1.txt
-rw-rw-r-- 1 saml saml   0 Sep 10 19:35 file2.txt

На основі відповіді @ jlliagre я не впевнений, чому я отримую 2 файли. Це може залежати від catреалізації.

ЗРІД №1

@jlliagre оновив свою відповідь, щоб показати цей код, який він називає рівноцінним:

>> file2.txt ; cat file1.txt >> file1.txt

Тож тепер я знаю, чому я пустую file2.txt. Ця нотація є законною:

>> file2.txt

І створить порожній файл.


Спробуйте ще раз, file1.txtпочинаючи з не порожнього.
Жил "ТАК - перестань бути злим"

@Gilles - я просто перечитав це і помітив це, чи повинен я побачити щось інше, я все-таки отримую помилку? Або ви просто говорите, що б / с приклад у моїй відповіді невірний? Я зафіксував відповідь BTW.
slm

@Gilles - це був твій голос, ні? Це просто для чогось конкретного чи відсутності значення відповіді?
slm

1
Не впевнений, чому ваша відповідь була озвучена, +1 за те, що я відчував, перш ніж відповісти, те, що я сам не робив ...
jlliagre

+1; дякую за експерименти! Я починаю краще розуміти перенаправлення та catповедінку.
Метт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.