Почему эта команда создает чрезвычайно большой файл?

19

Сегодня я экспериментировал с некоторыми операциями добавления и, по своему любопытству, запустил это (где file1.txt был не пуст, а file2.txt был пуст):

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

Когда я увидел, что это заняло некоторое время, я нажал Ctrl+, Cчтобы закончить. К тому времени размер файла file1.txt составлял сотни МБ.

Переключение имен файлов не дает того же эффекта; только когда файлы находятся в этом порядке, происходит бесконечное перенаправление. Что именно происходит, что вызывает это?

Matt
источник

Ответы:

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

Гну кошка:

cat: file1.txt: input file is output file

В любом случае их можно одурачить чем-то вроде:

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

Хорошее, не так бесполезное использование кошек ...

jlliagre
источник
19
Это много кошек, мяу.
SLM
2
Ты заставил мою голову кружиться, но ты ответил на мой вопрос!
Мэтт
7
И когда я спросил об этом в Google+ (не получил ответа), он автоматически пометил мой пост с помощью #Cat и #Caturday
Matt
3

Я не смог воспроизвести это в оболочке Bash:

# 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

И создаст пустой файл.

SLM
источник
Попробуйте еще раз, file1.txtначав с непустого.
Жиль "ТАК - перестань быть злым"
@ Жиль - я просто перечитал это и заметил, должен ли я увидеть что-то другое, я все еще получаю ошибку? Или вы просто говорите, что б / у пример в моем ответе неверен? Я исправил ответ, кстати.
SLM
@ Жиль - это был твой отрицательный голос, нет? Это только для чего-то конкретного или отсутствия значения ответа?
SLM
1
Не уверен, почему ваш ответ был отвергнут, +1 за то, что испытал, прежде чем ответить, что я сам не сделал ...
jlliagre
+1; спасибо за ваши эксперименты! Я начинаю понимать перенаправления и catповедение лучше.
Мэтт