
Возможный дубликат:
Как заставить 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
она сможет его прочитать. Обойти это невозможно, если вы используете перенаправление оболочки.