перенаправление кошек

11

Скажем, файл с именем abcсуществует в текущем каталоге и в нем есть текст. Когда вы выполняете команду:

cat abc > abc

Почему abcисчезает содержимое файла ?
Почему команда удаляет текст в нем, и файл становится пустым файлом?

Тулси Канодия
источник
А решения см. В разделе Можно ли cutизменить файл на месте?
Жиль "ТАК ... перестать быть злым"
10
Лазерный указатель является очень эффективным инструментом для перенаправления кошки. </ pun>
WBT
Моя кошка очень плохо реагирует на перенаправление ...
Ex Umbris
Чтобы избежать этой проблемы, я использую небольшой скрипт, который я назвал собакой :cat abc | dog abc
joeytwiddle
Другой вариант, если вы не возражаете против вывода на экран, это использовать tee.
Андреа Лаззаротто

Ответы:

27

Из-за того, как все сделано.

Когда вы делаете:

cat abc > abc

>является оператором перенаправления вывода, когда оболочка видит это, она открывает файл в режиме усечения, используя O_TRUNCфлаг, open(2)т. е. все open("abc", O_TRUNC), что было в файле, будет удалено. Обратите внимание, что это перенаправление выполняется сначала оболочкой перед выполнением catкоманды.

Поэтому, когда команда cat abcвыполняется, файл abcуже обрезан, и, следовательно cat, найдет файл пустым.

heemayl
источник
1
А как насчет кошки abc >> abc? Что происходит потом?
Тулси Канодия
2
@TulsiKanodia - это вызывает бесконечный цикл. Каждый раз, когда кошка читает строку, она добавляет другую, прежде чем перейти к следующей.
user3490
3
Это обнаружено и предотвращено. Вместо этого текст cat: filename: input file is output file(где filenameимя файла вы выбрали) печатается на старом стандартном выводе.
UTF-8
5

В дополнение к ответу @ heemayl , если вы хотите, чтобы код был более понятным в последовательности, в которой происходят события, вы можете просто поместить любые перенаправления в начало команды:

> abc cat abc
l0b0
источник