Sembolik bağların atomik olarak değiştirilmesi gerekir. Onları yazmanın yarısı kadar gidersen, işe yaramazlar. Sembolik bir bağlantının içeriği oldukça küçüktür (Linux'ta en fazla 4095 karakter: bir dosyaya giden yolun maksimum uzunluğu), bu nedenle sembolik bir bağlantının bir bölümünü çekirdek düzeyinde düzenlemek için küçük bir nokta olacaktır. Bu nedenle, çekirdek sembolik bir bağlantıyı düzenlemek için herhangi bir arabirim sunmaz, yalnızca yeni bir tane oluşturmak için bir arabirim, symlink
sistem çağrısı (ayrıca unlink
herhangi bir dosyayı kaldırmak için genel arabirim ) sunar.
symlink
Sistem çağrısı yalnızca yeni bir simgesel bağlantı oluşturur, bu varolan herhangi bir dosya kaldırmaz. Bu can sıkıcıdır, ancak open
(yeni bir dosya oluşturabilir veya mevcut bir dosyayı kesebilir, ancak yeni oluşturulan bir dosyayla mevcut bir dosyayı değiştiremez) gibi dosyalar oluşturmak için diğer sistem çağrılarıyla tutarlıdır mkdir
.
Kabukta, keşfettiğiniz gibi , sembolik bir bağı atomik olarak ln
komutla değiştiremezken ( ln -sf
önceki dosyanın işaretini kaldırır, sonra sembolik bağlantıyı oluşturur), önce geçici bir ad altında sembolik bir bağlantı oluşturarak bunu yapabilirsiniz. sonra yerine yerleştirin.
tmp=$(TMPDIR=$(dirname -- "$link") mktemp)
ln -sf -- "$target" "$tmp"
mv -f "$tmp" "$link"