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

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

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

head -1 foo.txt 

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

 head -1 foo.txt > foo.txt 

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

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

Зачем?

  • Есть ли команда типа «tee», которая ограничивает размер файла и обрабатывает выходной файл как очередь с фиксированным размером?
  • Безопасно ли вводить другую команду в STDIN, пока предыдущая команда записывает в STDOUT?
  • shell stderr to / dev / null
  • используя stdout дважды (но не tee, как я знаю)
  • Может ли запущенный скрипт идентифицировать контекст ведения журнала?
  • Трубы, как поток данных в трубопроводе?
  • grep ключевое слово из вывода Mplayer и отправить остальное в файл
  • что подразумевается под подключением STDOUT и STDIN?
  • 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 исчез.

    Interesting Posts

    hostapd несколько SSID с одним BSSID

    Как найти файлы, их имена, имена файлов находятся в одном файле?

    Цитирование: loop over ssh-accounts, вызов psql на удаленном сервере

    Изменение атрибутов «Дата создания» и «Последнее изменение» в файле другого файла

    Отображения общих библиотек в / proc / pid / maps

    CRON: pam_unix (cron: session): сеанс открыт для root пользователя (uid = 0): это должен быть процесс?

    Debian systemd network-online.target не работает?

    Удалить из курсора в конец строки на VI

    Как преобразовать образ диска dd в Clonezilla?

    Нужно удалить строку в fstab на OpenBSD

    как захватить статус возврата каждой команды из сценария оболочки с несколькими командами

    Ошибка Apt-get: запись большего количества данных, чем ожидалось (7643558> 7643216)

    Как я могу исправить размеры значков диалогового окна Chrome / Chromium в HiDPI?

    Как обнаружить экран заблокирован или нет, когда экранная заставка активна на Redhat 6.6?

    Как остановить все единицы, принадлежащие одной и той же цели?

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