Почему `cat`ing файл в себя стирает его?

Возможный дубликат:
Переадресация ввода-вывода и головная команда

Я просто хотел удалить все, кроме первой строки файла. Я сделал это:

head -1 foo.txt 

… и подтвердил, что я видел только первую строку. Затем я сделал:

 head -1 foo.txt > foo.txt 

Но вместо того, чтобы содержать только первую строку, foo.txt теперь пуст.

Оказывается, что cat foo.txt > foo.txt также cat foo.txt > foo.txt файл.

Зачем?

2 Solutions collect form web for “Почему `cat`ing файл в себя стирает его?”

Прежде чем оболочка начнет обрабатывать любые данные, необходимо убедиться, что все входные и выходные данные отведены в квадрат.

Поэтому в вашем случае с использованием > foo.txt основном сообщает системе: «создайте (новый) файл с именем foo.txt и foo.txt весь вывод этой команды в этот файл».

Проблема, как вы выяснили, в том, что она вытирает предыдущее содержимое.

Связанный, >> будет добавлен в существующий файл.

Обновление :

Вот решение с помощью sed , обращайтесь с осторожностью:

  sed -i '2,$d' foo.txt 

Он удалит строки 2 «последним» на месте в файле foo.txt . Лучше всего попробовать это в файле, который вы можете себе позволить сначала 🙂

Эта слегка измененная версия команды сохранит копию оригинала с расширением .bak :

  sed -i.bak '2,$d' foo.txt 

Вы можете указать любую последовательность символов (или один символ) после ключа командной строки -i для имени файла резервной копии (то есть оригинала).

Поскольку оболочка, которую вы используете для вызова cat выполняет перенаправление, обозначенное символом > .

Оболочка (bash, zsh, ksh, dash, whatever) читает команду cat foo.txt > foo.txt . Оболочка должна настроить перенаправление, указанное в > foo.txt . > означает начать запись файла сверху, >> означает добавить к foot.txt.

К тому времени, когда оболочка действительно запускает cat , foo.txt исчез.

  • pipe stdout-to-file с wc
  • Перенаправление / grep'ing STDOUT существующей оболочки
  • Предполагаемое поведение stdbuf для подпроцессов
  • Выход находится в консоли, но не является частью stdout или stderr
  • Могу ли я подключать stdout на одном сервере к stdin на другом сервере?
  • Попытка понять синтаксисы перенаправления bash и их выходы
  • Linux: как перенаправить stdout и stderr в logger?
  • Динамический ~ / .ssh / config
  • Командная строка 'buffer'
  • Как ничего не делать вечно элегантным способом?
  • Скрипт должен читать эхо-строку
  • Linux и Unix - лучшая ОС в мире.