Символічні посилання потрібно змінювати атомно. Якщо ви на півдорозі пишете їх, вони не працюватимуть. Вміст символічного посилання досить малий (щонайбільше 4095 символів в Linux: максимальна довжина шляху до файлу), тому було б мало сенсу редагувати частину символічної посилання на рівні ядра. Тому ядро не пропонує жодного інтерфейсу для редагування символічного посилання, лише інтерфейс для створення нового, symlink
системного виклику (плюс загальний інтерфейс unlink
для видалення будь-якого файлу).
symlink
Системний виклик тільки створює нову символічну посилання, він не видаляє існуючий файл. Це дратує, але відповідає іншим системним викликам для створення таких файлів, як open
(які можуть створити новий файл або обрізати існуючий файл, але не замінити існуючий файл новоствореним файлом) та mkdir
.
Як ви виявили , в оболонці, хоча ви не можете замінити символічне посилання атомно ln
командою ( ln -sf
від’єднує попередній файл, потім створює символічне посилання), ви можете це зробити, спочатку створивши символьне посилання під тимчасовим іменем та потім переміщуючи його на місце.
tmp=$(TMPDIR=$(dirname -- "$link") mktemp)
ln -sf -- "$target" "$tmp"
mv -f "$tmp" "$link"