Мое базовое понимание символической ссылки - это специальный файл, файл, содержащий строковый путь к другому файлу. VFS ядра абстрагирует многое из этого, но есть ли причина, по которой символические ссылки кажутся невозможными для редактирования?
Другими словами: я могу отредактировать символическую ссылку? Если нет, то почему?
Я понимаю, что существуют различные способы замены символических ссылок (в настоящее время в разделе ответов есть две альтернативы), но было бы интересно получить объяснение того, почему замена кажется единственным способом справиться с символическими ссылками. Почему вы не можете просто изменить, куда они указывают?
Ответы:
Учитывая, что он
-f
просто выполняет тихую замену, вы можете выполнить атомарную замену с помощьюmv -T
(-T заставляет это работать, даже если /loc.../link является каталогом) :linkname
доступен на протяжении всего процесса.источник
linkname
это не символическая ссылка на каталог. Чтобы избежать этого, используйте-T
опцию,mv
если в GNU или-h
во FreeBSD. Обратите внимание, что подобноеln -sf
не сохраняет права ссылки (в системах, где они значимы).-n
опции , например:ln -sfn DESTINATION_DIRECTORY LINK_NAME
. Узнайте больше на askubuntu.com/a/186227/69004Если под редактированием вы хотите изменить файл, на который он указывает, то да, вы можете:
-f
Параметр (--force
) при передаче в пер это заставляет его вызватьunlink()
системный вызов прямо передsymlink()
Взято из следующего ответа переполнения стека .
источник
test
что цель не является каталогом. В противном случаеln -s -f .profile test
создаст.profile
символическую ссылку в этом каталоге. У GNUln
есть-T
возможность избежать этого.Символические ссылки должны быть изменены атомарно. Если вы наполовину пишете их, они не сработают. Содержимое символической ссылки довольно мало (не более 4095 символов в Linux: максимальная длина пути к файлу), поэтому нет смысла редактировать часть символической ссылки на уровне ядра. Поэтому ядро не предлагает никакого интерфейса для редактирования символической ссылки, только интерфейс для создания новой,
symlink
системный вызов (плюс универсальный интерфейсunlink
для удаления любого файла).symlink
Системный вызов только создает новую символическую ссылку, он не удаляет существующий файл. Это раздражает, но согласуется с другими системными вызовами для создания файлов, таких какopen
(которые могут создать новый файл или обрезать существующий файл, но не заменить существующий файл вновь созданным файлом) иmkdir
.В оболочке, как вы обнаружили , хотя вы не можете атомарно заменить символическую ссылку
ln
командой (ln -sf
отсоединяет предыдущий файл, а затем создает символическую ссылку), вы можете сделать это, сначала создав символическую ссылку под временным именем и затем переместить его на место.источник
mv -f
(какln -sf
) не будет делать то, что вы хотите, если$link
указывает на каталог. У GNU ln и mv есть-T
для этого.mv
(переименовать системный вызов) всегда будет изменять inode, в$link
то время какln -sfT
(unlink + symlink) может использовать то же самое.Технически, нет встроенной команды для редактирования существующей символической ссылки. Это может быть легко достигнуто с помощью нескольких коротких команд.
Вот небольшая функция bash / zsh, которую я написал для обновления существующей символической ссылки:
источник
Предположим, что linkname существует в результате выполнения (в прошлом):
Затем есть три способа изменить символическую ссылку:
Используйте ln с
-f
силой и даже для каталогов-n
(inode может быть использован повторно):Удалите символическую ссылку и создайте новую (даже для каталогов):
создайте новую символьную ссылку, затем
mv
(атомарное изменение даже для каталогов):источник