Невозможно перезаписать файл, переместив на него другой файл.

Невозможно перезаписать файл, переместив на него другой файл.

У меня есть файл /some/foo, который является обычным текстовым файлом. Я могу редактировать его с помощью vimи могу catчто-то еще с ним сделать. Но всякий раз, когда я пытаюсь автоматизировать процесс редактирования с помощью sed, он говорит

sed: cannot move '/some/sedGl29Uj': Device or resource busy

Я попробовал перенаправить sedвывод во временный файл и catвсе ОК. Но если я попробую переместить туда временный файл, он скажет

root@localhost:/some # mv tmp foo
mv: Device or resource busy

Я очень обеспокоен, почему vimи catмогу записать файл, но mvне могу.
Ubuntu 16.04.1 LTS. /someявляется подпапкой /(корневая точка монтирования, ext4).

решение1

Нашел ответ при управлении монтированием дисков. Странная строка появилась, когда я проверял смонтированные диски.

~ # mount | grep /etc/hosts
/tmp/hosts on /etc/hosts type tmpfs (rw,nosuid,nodev,noexec,bind)

Это меня удивило. После того, как я перерыл все скрипты, которые я использовал, я нашел эту строку в скрипте модификатора хостов

sudo mount -o bind /tmp/hosts /etc/hosts

Затем я попробовал кое-что еще:

/tmp # echo aaa > a
/tmp # mount -o bind a b; cat b
aaa
/tmp # echo bbb > b; cat a
bbb
/tmp # echo ccc > c
/tmp # mv c b
mv: Device or resource busy

Решение, конечно же, в отмене этой точки монтирования:

sudo umount /etc/hosts

решение2

Вероятно, у вас нет прав на запись в каталог. Файловые операции: создание, удаление и переименование — все изменяют каталог.

catи vimпросто изменить содержимое файла и не нужно изменять сам файл. sed -iзаписывает временный файл и переименовывает его.

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