Подтвердить что ты не робот

Заменить важную символическую ссылку безопасно

Я хотел бы изменить цель символической ссылки из bash script. Проблема в том, что символическая ссылка очень важна (это /bin/sh, а именно), и я бы сделал это по-модулю, чтобы:

  • Новая цель будет доступна сразу после удаления старого, т.е. не будет никакой возможности, что что-то заметит его исчезновение,
  • Не будет никакой возможности, что изменение не будет выполнено в середине, то есть оставить пользователя с удаленной символикой и не будет новой.

Я подумал о двух методах. Либо используя обычный ln:

ln -fs /bin/bash /bin/sh

или используя mv:

ln -s /bin/bash /bin/sh.new
mv /bin/sh.new /bin/sh

Какой из них лучше подходит моим потребностям? Есть ли вероятность, что один из них попытается заменить цель symlink вместо самой символической ссылки?

4b9b3361

Ответ 1

Переименование (mv) - это атомная операция; создание новой символической ссылки не является (удалить старую символическую ссылку, создать новую). Поэтому вы должны использовать mv:

$ ln -s new current_tmp && mv -Tf current_tmp current

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

Ответ 2

Похоже, что (с man-страницы) ln -f отключает символическую ссылку до создания новой, что означает, что mv - лучший вариант для этого.

Я бы настоятельно рекомендовал не связывать /bin/sh с bash. Многие скрипты используют:

#!/bin/sh

и записываются в предположении, что оболочка является классической оболочкой Bourne. Если бы это было для запуска bash вместо этого, вы могли бы легко получить неясность несовместимости между тем, что делает script, принимает sh и что делает bash. Это будет почти невозможно отследить.