Могу ли я читать и писать в один и тот же файл в Linux, не перезаписывая его?

Могу ли я читать и писать в один и тот же файл в Linux, не перезаписывая его?

Возможный дубликат:
Как заставить iconv заменить входной файл преобразованным выходным файлом?

Я часто подключаюсь к Amazon EC2, используя их публичные DNS-имена
( ec2-12-34-56-78.compute-1.amazonaws.com), и из-за этого мой known_hostsфайл переполняется большим количеством ec2записей, которые я больше никогда не буду использовать.

Я знаю, что, вероятно, можно было бы sed -iотредактировать на месте, но мне хотелось использовать grep, поэтому я сделал это:

grep -v ec2 ~/.ssh/known_hosts > ~/.ssh/known_hosts

Это оставляет known_hostsпустой файл. Если я сделаю:

grep -v ec2 ~/.ssh/known_hosts > ~/.ssh/tmp
mv ~/.ssh/tmp ~/.ssh/known_hosts

тогда все в порядке, но я не понимаю, почему чтение и запись в один и тот же файл оставляет его пустым, и есть ли способ обойти это при использовании grep, catи т. д.

решение1

Есть такая утилитаsponge которая является частьюmoreutilssuite. Он был создан именно для этой цели.

grep -v ec2 ~/.ssh/known_hosts | sponge ~/.ssh/known_hosts

решение2

Перенаправления выполняются оболочкой до запуска команды. Это означает, что оболочке приказано обрезать файл, прежде чем grepона сможет его прочитать. Обойти это невозможно, если вы используете перенаправление оболочки.

Связанный контент