Mi comprensión básica de un enlace simbólico es como un archivo especial, un archivo que contiene una ruta de cadena a otro archivo. El VFS del núcleo extrae mucho de eso, pero ¿hay alguna razón por la cual los enlaces simbólicos parezcan imposibles de editar?
En otras palabras: ¿puedo editar un enlace simbólico? ¿Si no, porque no?
Entiendo que hay varias formas de reemplazar los enlaces simbólicos (actualmente hay dos alternativas en la sección de respuestas), pero sería interesante obtener una explicación de por qué el reemplazo parece ser la única forma de tratar los enlaces simbólicos. ¿Por qué no puedes simplemente cambiar dónde apuntan?
filesystems
symlink
Oli
fuente
fuente

Respuestas:
Dado que
-fsolo hace un reemplazo silencioso, puede hacer un reemplazo atómico conmv -T(-T lo hace funcionar incluso si /loc.../link es un directorio) :linknameEs accesible durante todo el proceso.fuente
linknameque no es un enlace simbólico a un directorio. Use la-Topciónmvif en GNU o-hen FreeBSD para evitar eso. Tenga en cuenta que asíln -sfno se conservan los permisos del enlace (en sistemas donde son significativos).-nlas opciones, por ejemplo:ln -sfn DESTINATION_DIRECTORY LINK_NAME. Más información en askubuntu.com/a/186227/69004Si por edición, quiere cambiar el archivo al que apunta, entonces sí puede:
El
-fparámetro (--force) cuando se pasa a ln hace que llame a la llamada delunlink()sistema justo antessymlink()Tomado de la siguiente respuesta de desbordamiento de pila .
fuente
testel objetivo no es un directorio. Deln -s -f .profile testlo contrario , crearía un.profileenlace simbólico en ese directorio. GNUlntiene una-Topción para evitar eso.Los enlaces simbólicos deben modificarse atómicamente. Si estás a la mitad de escribirlas, no funcionarán. El contenido de un enlace simbólico es bastante pequeño (como máximo 4095 caracteres en Linux: la longitud máxima de una ruta a un archivo), por lo que no tendría mucho sentido editar parte de un enlace simbólico a nivel del núcleo. Por lo tanto, el núcleo no ofrece ninguna interfaz para editar un enlace simbólico, solo una interfaz para crear uno nuevo, la
symlinkllamada al sistema (más la interfaz genéricaunlinkpara eliminar cualquier archivo).La
symlinkllamada al sistema solo crea un nuevo enlace simbólico, no elimina ningún archivo existente. Esto es molesto, pero coherente con otras llamadas del sistema para crear archivos comoopen(que puede crear un nuevo archivo o truncar un archivo existente, pero no reemplazar un archivo existente por un archivo recién creado) ymkdir.En el shell, como descubrió , aunque no puede reemplazar un enlace simbólico atómicamente con el
lncomando (ln -sfdesvincula el archivo anterior y luego crea el enlace simbólico), puede hacerlo creando primero un enlace simbólico con un nombre temporal y luego moviéndolo a su lugar.fuente
mv -f(comoln -sf) no hará lo que quiera si$linkapunta a un directorio. GNU ln y mv tienen un-Tpara eso.mv(cambiar el nombre de la llamada al sistema) siempre cambiará el inodo de$linkwhileln -sfT(unlink + symlink) podría reutilizar lo mismo.Técnicamente, no hay un comando incorporado para editar un enlace simbólico existente. Se puede lograr fácilmente con unos pocos comandos cortos.
Aquí hay una pequeña función bash / zsh que escribí para actualizar un enlace simbólico existente:
fuente
Suponga que linkname existe como resultado de haberlo hecho (en el pasado):
Luego, hay tres formas de cambiar el enlace simbólico:
Use ln con
-ffuerza e incluso para directorios-n(el inodo podría reutilizarse):Elimine el enlace simbólico y cree uno nuevo (incluso para directorios):
cree un nuevo enlace simbólico, luego
mv(cambio atómico incluso para directorios):fuente