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

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

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

  • Командная строка 'buffer'
  • Только выходные результаты grep
  • Подавлять сообщения о запуске на stdout?
  • Может ли запущенный скрипт идентифицировать контекст ведения журнала?
  • Как получить строки от 10 до 100 из 200-строкового файла в новый файл
  • Откуда идет вывод приложения из диспетчера окон?
  • head -1 foo.txt 

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

     head -1 foo.txt > foo.txt 

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

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

    Зачем?

  • Как фильтровать stdout программы через grep, все еще контролируя программу?
  • 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 - лучшая ОС в мире.