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
-f
solo hace un reemplazo silencioso, puede hacer un reemplazo atómico conmv -T
(-T lo hace funcionar incluso si /loc.../link es un directorio) :linkname
Es accesible durante todo el proceso.fuente
linkname
que no es un enlace simbólico a un directorio. Use la-T
opciónmv
if en GNU o-h
en FreeBSD para evitar eso. Tenga en cuenta que asíln -sf
no se conservan los permisos del enlace (en sistemas donde son significativos).-n
las 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
-f
pará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
test
el objetivo no es un directorio. Deln -s -f .profile test
lo contrario , crearía un.profile
enlace simbólico en ese directorio. GNUln
tiene una-T
opció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
symlink
llamada al sistema (más la interfaz genéricaunlink
para eliminar cualquier archivo).La
symlink
llamada 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
ln
comando (ln -sf
desvincula 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$link
apunta a un directorio. GNU ln y mv tienen un-T
para eso.mv
(cambiar el nombre de la llamada al sistema) siempre cambiará el inodo de$link
whileln -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
-f
fuerza 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