Я недавно получил немного неправильного поведения в моем bash-скрипте и мне было интересно:
- Это ожидаемое поведение системы, или это ошибка
- Каковы идеальные обходные пути
По сути, проблема сводилась к этому. Сначала у меня была существующая структура каталогов со следующим макетом.
/opt/dir/file.a
/opt/dir/file.b
/opt/dir/file
где file
- это жесткая ссылка на file.a
Я хотел заменить file
сценарием оболочки, который выбирал file.a
или file.b
зависимости от параметров, поэтому я запустил что-то вроде этого:
cp my_file /opt/dir/file
Проблема в том, что поскольку file
является жесткой ссылкой на file.a
(это означает, что два файла на самом деле являются просто двумя именами для одного и того же inode), это изменение было отражено как в file
и в file.a
. Это было явно не то, что я хотел.
Кажется, что команда cp
эффективно открыла /opt/dir/file
с флагом усеченного файла что-то вроде: fopen("file", "w+")
. и написал ему. Я ожидал, что это сломает жесткую ссылку, так как я копировал новый файл с этим именем.
Это правильное и ожидаемое поведение cp
? Это кажется не интуитивным для меня. Когда я копирую файл из одного места в другое, я думаю, что заменяю его, а не переписываю. Есть флаг для cp
чтобы избежать этого? Мой текущий обходной путь заключается в том, что я использую rm /opt/dir/file && cp my_file /opt/dir/file
.
Глядя на справочную страницу, кажется, что cp --remove-destination my_file /opt/dir/file
может быть правильным решением, но мне все еще интересно, что каждый должен сказать по этому вопросу.