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

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

я использую

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

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

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

решение1

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

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

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

трасса с -n:

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

трасса Без -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

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

решение2

Вы можете использовать -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

Связанный контент