Назад | Перейти на главную страницу

как обновить цель символической ссылки (ln -f -s не работает)

я использую

ln -f -s / var / www / html / Release / build1390 текущее приложение

для обновления символической ссылки "текущее приложение" с новым местом назначения. Однако это не работает, ссылка app-current сохраняет исходное место назначения, однако я не получаю никаких ошибок ...

Я бы предпочел не удалять ссылку и создавать ее заново, а просто обновляю цель существующей ссылки. Это возможно?

Это работает для меня, каков результат strace ln -f -s /var/www/html/releases/build1390 app-current ?

О, так как это каталог, вам нужно добавить -n без разыменования, и это должно решить проблему. -f действительно больше удобство, так как добавление -f в любом случае просто приводит к отключению. Хотя я предполагаю, что это могло бы произойти на несколько сотен мс быстрее в нормально загруженной системе.

Например, если arf уже указывает на / home:

strace с -n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

strace Без -n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

Так что без -n arf разыменовывается, поэтому ln обрабатывает его как arf, как если бы он был на самом деле /. В вашем конкретном примере, если ошибки нет, я думаю, вы, вероятно, создали новую символическую ссылку внутри /var/www/html/releases/build1390 app-current и захочется очистить это.

Ты можешь использовать -n или --no-dereference чтобы предотвратить разыменование цели, если это символическая ссылка. Вы также можете использовать -T или --no-target-directory чтобы гарантировать, что целевой файл будет всегда рассматриваться как обычный файл.

Они вызывают несколько иное поведение, как показано в следующем примере. Предположим src это какой-то файл, dirlink символическая ссылка на каталог, а dir это актуальный каталог.

С помощью -n:

  • ln -sfn src dirlink перезаписывает dirlink и связывает его с src
  • ln -sfn src dir создает ссылку dir/src -> src

С помощью -T:

  • ln -sfT src dirlink перезаписывает dirlink и связывает его с src
  • ln -sfT src dir выдает сообщение об ошибке: ln: ‘dir’: cannot overwrite directory