Почему перенаправление на тот же файл усекает файл?

11

Обычно мы используем другой файл для перенаправления вывода.

Например :

cat < first > temp

В этой команде содержимое first перенаправляется в temp вместо стандартного вывода.

Тогда почему он усекает файл, если я использую то же имя файла?

Почему он не может перезаписать один и тот же файл?

cat < first > first 
Searock
источник

Ответы:

19

Когда вы используете перенаправление ввода / вывода таким образом, оба файла «input» и «output» открываются оболочкой перед выполнением команды. А открытие файла для перезаписи - это то же самое, что обрезать его перед записью. Результат: catвидит пустой файл на входе ...

Janc
источник
0

Потому что обработка в общем случае будет очень сложной. Просто рассмотрите следующий пример:

Программа читает файл построчно и выводит каждую строку дважды. Теперь, чтобы это работало без второго файла (т. Е. В том же файле), программе потребуется буферизовать большую часть (всех) строк, которые она будет читать, поскольку в противном случае они будут перезаписаны, прежде чем их можно будет прочитать.

Для простоты программы обычно используют вторичный, временный файл, который они перемещают поверх оригинала после завершения. Это, например, как sed -i(встроенный) работает.

Серая пантера
источник
0

Как правило, синтаксис для перенаправления в этом случае должен быть cat first > temp. Это означает, что catвыходные данные firstотправляются в файл temp. В случае вашего утверждения cat < first > tempвывод catне был завершен в тот момент, когда он был перенаправлен снова. Ничто в результате не приводит ни к чему.

Однако, catесли файл и выходные данные перенаправлены в другой файл, ничем не отличается от основного cp.

Кейси Келлер
источник
cat < first > tempработает просто отлично.
Janc