перенаправлення кішок


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)ie open("abc", O_TRUNC), тому все, що там було у файлі, не буде втрачено. Зауважте, що це перенаправлення виконується спочатку оболонкою перед catзапуском команди.

Отже, коли команда cat abcвиконується, файл abcуже врізаний, тому catфайл знайде порожнім.


1
Що про кішку abc >> abc? Що ж відбувається тоді?
Tulsi Kanodia

2
@TulsiKanodia - це викликає нескінченну петлю. Кожен раз, коли кішка читає рядок, додає інший, перш ніж переходити до наступного.
користувач3490

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.