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

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

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

head -1 foo.txt 

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

 head -1 foo.txt > foo.txt 

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

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

Зачем?

  • Перенаправление tr stdout в файл
  • Перенаправить часть скрипта bash в файл для захвата set -x output
  • Откуда идет вывод приложения из диспетчера окон?
  • Как сделать скрытые команды оболочки невидимыми?
  • Предполагаемое поведение stdbuf для подпроцессов
  • Запись на stdout, кроме перенаправления вывода C
  • Как фильтровать stdout программы через grep, все еще контролируя программу?
  • Что считается «идеальным» в отношении использования stdout / stderr для вывода в разных ситуациях?
  • 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 исчез.

    Linux и Unix - лучшая ОС в мире.