Чому перенаправлення на один і той же файл обрізає файл?


11

Зазвичай ми використовуємо інший файл для перенаправлення виводу.

Наприклад :

cat < first > temp

У цій команді вміст першого переспрямовується на temp замість стандартного виводу.

Тоді чому він обрізає файл, якщо я використовую те саме ім’я файлу?

Чому він не може перезаписати той самий файл?

cat < first > first 

Відповіді:


19

Коли ви використовуєте перенаправлення вводу / виводу таким чином, оболонка "вхідний" і "вихідний" відкриваються оболонкою перед виконанням команди. І відкрити файл для перезапису - це те саме, що обрізати його перед записом. Результат: catна вході бачить порожній файл ...


0

Тому що поводження з ним у загальному випадку було б дуже складним. Просто розглянемо наступний приклад:

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

Прості програми зазвичай використовують вторинний тимчасовий файл, який вони переміщують над оригіналом після їх закінчення. Це, наприклад, як sed -i(вбудований) працює.


0

Зазвичай синтаксис для переадресації в цьому випадку має бути cat first > temp. Це означає, що catвихідний firstфайл відправляється у файл temp. У випадку вашого твердження cat < first > temp, вихід catне завершений під час його повторного перенаправлення. Нічого в результаті нічого не виходить.

Однак catфайл і вихід, переспрямований на інший файл, не відрізняються від базового cp.


cat < first > tempпрацює просто чудово.
JanC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.