प्रतीकात्मक लिंक को परमाणु रूप से संशोधित करने की आवश्यकता है। यदि आप उन्हें लिखने के माध्यम से आधे रास्ते पर हैं, तो वे काम नहीं करेंगे। एक प्रतीकात्मक लिंक की सामग्री बहुत छोटी है (लिनक्स पर अधिकांश 4095 वर्णों पर: किसी फ़ाइल के लिए पथ की अधिकतम लंबाई), इसलिए कर्नेल स्तर पर एक प्रतीकात्मक लिंक के भाग को संपादित करने में बहुत कम बिंदु होंगे। इसलिए कर्नेल एक प्रतीकात्मक लिंक को संपादित करने के लिए किसी भी इंटरफ़ेस की पेशकश नहीं करता है, केवल एक नया बनाने के लिए एक इंटरफ़ेस, symlink
सिस्टम कॉल (प्लस unlink
किसी भी फ़ाइल को निकालने के लिए सामान्य इंटरफ़ेस )।
symlink
सिस्टम कॉल केवल एक नया प्रतीकात्मक कड़ी बनाता है, यह किसी भी मौजूदा फ़ाइल को दूर नहीं करता। यह कष्टप्रद है, लेकिन फ़ाइलों को बनाने के लिए अन्य सिस्टम कॉल के साथ संगत है open
( जैसे कि एक नई फ़ाइल बना सकते हैं या किसी मौजूदा फ़ाइल को काट सकते हैं, लेकिन किसी मौजूदा फ़ाइल को एक नई बनाई गई फ़ाइल से प्रतिस्थापित नहीं कर सकते हैं) और mkdir
।
शेल में, जैसा कि आपने खोजा है , जबकि आप प्रतीकात्मक लिंक को ln
कमांड के साथ एटोमिकली बदल नहीं सकते हैं ( ln -sf
पिछली फाइल को अनलिमिटेड लिंक बनाते हैं), आप इसे पहले एक अस्थायी नाम के तहत एक प्रतीकात्मक लिंक बनाकर कर सकते हैं और फिर इसे जगह में ले जाना।
tmp=$(TMPDIR=$(dirname -- "$link") mktemp)
ln -sf -- "$target" "$tmp"
mv -f "$tmp" "$link"