Обычно мы используем другой файл для перенаправления вывода.
Например:
cat < first > temp
В этой команде содержимое first перенаправляется на temp вместо стандартного вывода.
Тогда почему он усекает файл, если я использую то же имя файла?
Почему он не может перезаписать один и тот же файл?
cat < first > first
Как правило, синтаксис для перенаправления в этом случае должен быть cat first > temp
. Это означает, что вывод cat
из first
отправляется в файл temp
. В случае вашего утверждения cat < first > temp
вывод cat
не был завершен во время его перенаправления на выход. Ничто в результате не приводит ни к чему.
Однако cat
файл и вывод, перенаправленный в другой файл, ничем не отличается от базового cp
.
Потому что обработка в общем случае была бы очень сложной. Просто рассмотрим следующий пример:
Программа читает строку за строкой и выводит каждую строку дважды. Теперь, чтобы это работало без второго файла (т. Е. В том же файле), программе потребуется буферизовать большую часть (всех) строк, которые она будет читать, поскольку в противном случае они будут перезаписаны, прежде чем их можно будет прочитать.
Для простоты простые программы обычно используют вторичный, временный файл, который они перемещают поверх оригинала после завершения. Это, например, как работает sed -i
(inline).
Когда вы используете перенаправление ввода / вывода таким образом, оба «входа» & amp; «выходной» файл открывается оболочкой до выполнения команды. А открытие файла для перезаписи - это то же самое, что обрезать его перед записью. Результат: cat
видит пустой файл на входе ...