Почему чтение и запись того же файла посредством перенаправления ввода-вывода приводят к пустому файлу в Unix?

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

sed 's/abd/def/g' a.txt > a.txt

Кто-либо может объяснить почему?

7
задан Palec 6 January 2014 в 16:43
поделиться

3 ответа

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

16
ответ дан 6 December 2019 в 07:06
поделиться

Для редактирования файла на месте необходимо использовать параметр -i :

sed -i .bck 's / abd / def / g' a. txt

РЕДАКТИРОВАТЬ: как заметил Нил, перенаправление сначала открывает файл для записи, таким образом, очищает его.

РЕДАКТИРОВАТЬ2: это может быть интересно для некоторых читателей

В OSX, если вы хотите использовать - i с пустым расширением, чтобы предотвратить создание файла резервной копии, вам также необходимо использовать переключатель -e , иначе он не сможет правильно проанализировать аргументы:

sed -i -e 's / abc / def / g' a.txt

1
ответ дан 6 December 2019 в 07:06
поделиться

Операции перенаправления <, > и т. Д. Обрабатываются оболочкой. Когда вы даете команду оболочке, которая включает перенаправление, оболочка сначала откроет файл. В случае > файл будет открыт для записи, что означает, что он будет обрезан до нулевого размера. После того, как файлы перенаправления были открыты, оболочка запускает новый процесс, привязывая свой стандартный ввод, вывод и ошибку к любым возможным перенаправленным файлам, и только затем выполняет указанную вами команду. Поэтому, когда команда sed в вашем примере начинает выполнение, a.txt уже усечен оболочкой.

Между прочим, и несколько косвенно,

8
ответ дан 6 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: