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
.