Почему `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 исчез.

  • Как перенаправить одно и то же сообщение на stdoud и stderr (без временного объекта)
  • Как отображать вывод команды во время ее разбора?
  • Отображать вывод на консоль, пока используется grep
  • Подавлять сообщения о запуске на stdout?
  • Как эти параметры qemu для перенаправления stdout работают?
  • используя stdout дважды (но не tee, как я знаю)
  • Как определить, присутствует ли строка в stdout, не влияя на вывод?
  • tee stdout to stderr?
  • Убейте процесс, если он успокоится в течение определенного времени
  • Предотвращать создание сценария при генерации stdout при вызове из данной программы
  • Перенаправить stdout программы командной строки Windows под вином
  • Linux и Unix - лучшая ОС в мире.