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


11

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

cat abc > abc

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



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, найдет файл пустым.


1
А как насчет кошки abc >> abc? Что происходит потом?
Тулси Канодия

2
@TulsiKanodia - это вызывает бесконечный цикл. Каждый раз, когда кошка читает строку, она добавляет другую, прежде чем перейти к следующей.
user3490

3
Это обнаружено и предотвращено. Вместо этого текст cat: filename: input file is output file(где filenameимя файла вы выбрали) печатается на старом стандартном выводе.
UTF-8


5

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

> abc cat abc
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.