7 votos

Comando de enlace en el terminal vs ln vs enlace simbólico (ln -s) diferencias entre ellos?

He aprendido sobre alias y enlaces simbólicos hace tiempo, pero solo recientemente aprendí sobre el comando link en enlace simbólico vs. alias

¿Es el comando link en la terminal de mi MacOS - versión Sonoma 14.4.1 el mismo que ln o es un comando diferente?

En realidad no he hecho esto a menudo en la terminal, pero lo hice:

touch test1.txt

luego lo edité en un editor de texto con el contenido "Prueba"

y luego en la terminal:

link test1.txt test2.txt

¿Cuándo sería útil el comando link en MacOS en comparación con enlace simbólico y alias?

¡Si pudieras explicarlo, sería muy apreciado!

10voto

En macOS, ambos ejecutables tienen el mismo número de nodo-i, por lo que técnicamente son los mismos.

$ ls -il /bin/{link,ln}
1152921500312524105 -rwxr-xr-x  2 root  wheel  101968 Mar 21 07:13 /bin/link*
1152921500312524105 -rwxr-xr-x  2 root  wheel  101968 Mar 21 07:13 /bin/ln*

Si ejecutas man link, obtendrás la misma página de manual que para ln. La diferencia es que link no toma ninguna opción y siempre crea un enlace duro. Para las diferencias entre enlaces duros, enlaces simbólicos y alias, consulta esta respuesta.

SINOPSIS
     ln [-L | -P | -s [-F]] [-f | -iw] [-hnv] archivo_origen [archivo_destino]
     ln [-L | -P | -s [-F]] [-f | -iw] [-hnv] archivo_origen ... directorio_destino
     link archivo_origen archivo_destino

...

Cuando se llama a la utilidad como link, deben suministrarse exactamente dos argumentos, ninguno de los cuales puede especificar un directorio. En este modo de operación simple, que realiza una operación link(2) utilizando los dos argumentos pasados, no se pueden suministrar opciones.

Sinceramente, no veo un uso práctico para link en la actualidad (ni siquiera sabía que existía esta variante, ¡y llevo más de 30 años usando sistemas de estilo Unix).

3voto

David G. Puntos 131

Creo que la respuesta correcta aquí es muy histórica.

En la versión 6 de Unix, el sistema de archivos no era estrictamente jerárquico. En realidad, podías tener múltiples nombres para un directorio. Esto fue "eliminado" en la versión 7 (pero no completamente). Y mkdir y rmdir eran programas suid que realizaban múltiples syscalls para crear o eliminar el directorio.

En ese momento, link podía crear un enlace duro a un directorio. Con la versión 7, link requería que ya fueras root para enlazar duro un directorio. Aunque la capacidad de enlazar duro un directorio ha desaparecido, el comando para hacerlo no. Presumiblemente, el comando se mantiene porque podría haber personas (y scripts) que lo usen.

Dado que el comando pasa sus parámetros directamente al syscall del kernel, el comportamiento puede ser un poco más predecible. Es importante señalar que, si el destino existe, link siempre falla, mientras que ln añadirá el nombre de archivo original sin la ruta si el destino es un directorio.

Cabe destacar que la naturaleza estrictamente jerárquica del sistema de archivos suele ser ahora parte del diseño del sistema de archivos.

Editar: En realidad no estoy seguro de cuándo se agregó el comando link. No parece aparecer en las páginas de manual electrónicas de la versión 7 que tengo (y no estoy seguro de dónde está mi copia impresa). Ciertamente estaba en el sistema BSD basado en VAX que utilicé. Es trivial de implementar... solo unas pocas líneas de código.

1voto

David Anderson Puntos 2189

Varios nombres de archivos pueden estar vinculados directamente al mismo archivo. Cada enlace puede ocurrir en el mismo directorio o en diferentes directorios. Por ejemplo, si dos colecciones diferentes contienen la misma imagen y ambas colecciones se almacenan en directorios diferentes, entonces se puede ahorrar espacio almacenando la imagen en un solo archivo. Un nombre de archivo puede luego almacenarse en cada directorio con un enlace de retorno al inodo del archivo. En otras palabras, un nombre de archivo se almacena en cada directorio junto con el inodo. El archivo asociado al inodo también tiene un contador de referencias asociado que se establecería en 2. Los nombres de los archivos pueden ser diferentes, pero el inodo sería el mismo. Otro ejemplo sería cuando un archivo contiene información sobre la zona horaria para una ciudad dada. Un directorio podría contener una colección de archivos nombrados según las ciudades. En este caso, un solo archivo de zona horaria podría estar vinculada a múltiples nombres de ciudad dentro del mismo directorio.

Los archivos de objetos ejecutables tienen la capacidad de determinar la ruta y el nombre del archivo dado para invocarlos. En cuanto al ejecutable con los nombres ln en link, solamente el nombre link tiene un significado especial. Intentaré ilustrarlo a través de los siguientes ejemplos. En el primer ejemplo, se produce un mensaje de error. El mensaje muestra que el comando sabe que su nombre es ln.

% ln -z
ln: illegal option -- z
usage: ln [-Ffhinsv] source_file [target_file]
       ln [-Ffhinsv] source_file ... target_dir
       link source_file target_file

En el siguiente ejemplo, el comando sabe que su ruta y nombre es /bin/ln.

% /bin/ln -z
/bin/ln: illegal option -- z
usage: ln [-Ffhinsv] source_file [target_file]
       ln [-Ffhinsv] source_file ... target_dir
       link source_file target_file

A continuación, creo un directorio local, luego copio el comando al directorio. Aquí el comando sabe que ahora su nombre es fred.

% cd ~
% mkdir test
% cd test
% cp /bin/ln fred
% ./fred -z
./fred: illegal option -- z
usage: ln [-Ffhinsv] source_file [target_file]
       ln [-Ffhinsv] source_file ... target_dir
       link source_file target_file

En esta ocasión, logro crear exitosamente un enlace simbólico.

% echo hi >hi.txt
% ./fred -s hi.txt hi2.txt
% ls -li
total 72
114259724 -rwxr-xr-x  1 davidanderson  staff  32160 Mar 28 15:16 fred
114261744 -rw-r--r--  1 davidanderson  staff      3 Mar 28 15:18 hi.txt
114261755 lrwxr-xr-x  1 davidanderson  staff      6 Mar 28 15:18 hi2.txt -> hi.txt

Sin embargo, si cambio el nombre del comando a link, entonces no puedo crear un nuevo enlace simbólico. El nombre link tiene un significado especial.

% mv fred link
% ./link -s hi.txt hi3.txt
./link: illegal option -- s
usage: ln [-Ffhinsv] source_file [target_file]
       ln [-Ffhinsv] source_file ... target_dir
       link source_file target_file

Sin embargo, puedo crear exitosamente un enlace directo. A continuación, tanto hi.txt como hi3.txt tienen el mismo inodo y el número de enlaces (es decir, contador de referencias) se establece en 2.

% ./link hi.txt hi3.txt
% ls -li
total 80
114261744 -rw-r--r--  2 davidanderson  staff      3 Mar 28 15:18 hi.txt
114261755 lrwxr-xr-x  1 davidanderson  staff      6 Mar 28 15:18 hi2.txt -> hi.txt
114261744 -rw-r--r--  2 davidanderson  staff      3 Mar 28 15:18 hi3.txt
114259724 -rwxr-xr-x  1 davidanderson  staff  32160 Mar 28 15:16 link

Las preguntas y respuestas aquí en Ask Different no deberían adentrarse en la programación. Sin embargo, si estás interesado, puedes leer la fuente pertinente para la versión 14.3 de macOS en este enlace. El punto de entrada principal está en la línea 74. Para la línea 91, se ha eliminado la ruta y el código está verificando si el nombre es link.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X