я использую
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
Так что без -n
arf происходит разыменование, поэтому 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