AFAIK, hayır, yapamazsınız. Onu kaldırmalı ve yeniden yaratmalısınız. Aslında, bir sembolik bağın üzerine yazabilir ve böylece referans gösterilen yol adını güncelleyebilirsiniz:
$ ln -s .bashrc test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 7 2009-09-23 17:12 test -> .bashrc
$ ln -s .profile test
ln: creating symbolic link `test': File exists
$ ln -s -f .profile test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 8 2009-09-23 17:12 test -> .profile
DÜZENLEME : OP'nin bir yorumda belirttiği gibi, --force
seçeneğin kullanılması ln
daha unlink()
önce bir sistem çağrısı yapılmasını sağlayacaktır symlink()
. Aşağıda, strace
linux kutumdaki çıktı bunu kanıtlıyor:
$ strace -o /tmp/output.txt ln -s -f .bash_aliases test
$ grep -C3 ^unlink /tmp/output.txt
lstat64("test", {st_mode=S_IFLNK|0777, st_size=7, ...}) = 0
stat64(".bash_aliases", {st_mode=S_IFREG|0644, st_size=2043, ...}) = 0
symlink(".bash_aliases", "test") = -1 EEXIST (File exists)
unlink("test") = 0
symlink(".bash_aliases", "test") = 0
close(0) = 0
close(1) = 0
Sanırım son cevap "hayır".
DÜZENLEME : Aşağıdakiler, Arto Bendiken'in yaklaşık 2016 yılında unix.stackexchange.com adresindeki yanıtından kopyalanmıştır .
Bu olabilir gerçekten atomik olarak yapılabilir rename(2)
ilk geçici adı altında yeni sembolik oluşturarak ve ardından temiz bir şekilde tek seferde eski sembolik üzerine yazarak. Gibi adam sayfası devletler:
Yeni yol sembolik bir bağlantıya atıfta bulunursa , bağlantının üzerine yazılır.
Kabukta bunu şu şekilde yaparsınız mv -T
:
$ mkdir a b
$ ln -s a z
$ ln -s b z.new
$ mv -T z.new z
Sen olabilir strace
o son komut emin olmak için gerçekten kullanıyorrename(2)
kaputun altında:
$ strace mv -T z.new z
lstat64("z.new", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
lstat64("z", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
rename("z.new", "z") = 0
Yukarıda her ikisinin de mv -T
ve strace
Linux özgüdür.
FreeBSD'de şunu kullanın mv -h
dönüşümlü olarak .
Editörün notu: Capistrano bunu ~ 2.15'ten beri yıllardır böyle yapıyor. Bu çekme talebine bakın .
ln
eski bağlantının üzerine yazarak sadece komutu (veya API eşdeğerini) yayınlamıyorsunuz? Ne problemin var?