3

Я недавно получил немного неправильного поведения в моем bash-скрипте и мне было интересно:

  1. Это ожидаемое поведение системы, или это ошибка
  2. Каковы идеальные обходные пути

По сути, проблема сводилась к этому. Сначала у меня была существующая структура каталогов со следующим макетом.

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

1 ответ1

2

То, что вы описываете, это правильное поведение для cp , а не ошибка. Учитывая результат, который вы ищете, изменения, которые вы внесли в ваш скрипт (rm затем cp), звучат как правильный подход.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .