Заменить важную символическую ссылку безопасно
Я хотел бы изменить цель символической ссылки из 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 вместо самой символической ссылки?
Ответы
Ответ 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
. Это будет почти невозможно отследить.