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