Quando você fez o ls -il /usr/bin
, você estava listando nomes de arquivos e números de inodes correspondentes. Neste contexto, é provavelmente melhor pensar em "file name" como separado de "inode", e pensar no inode como o arquivo.
O "inode" é tipicamente uma estrutura de dados em disco contendo metadados (permissons, propriedade, tempo de criação, tempo de acesso, etc) e os blocos de disco que contêm os dados do arquivo. Dependendo do sistema de arquivos, os inodes podem ser localizados estrategicamente em torno do disco ou podem ser armazenados em um banco de dados de vários tipos. Na maioria das vezes, há um algoritmo rápido para ir do número de inode para o bloco de disco no qual o inode está, de modo que a pesquisa seja bastante rápida.
Deste ponto de vista, todo nome de arquivo é apenas um "link físico". Um diretório apenas combina nomes de arquivos e números de inode. Nenhuma distinção é feita entre um "nome de arquivo real" e um "link físico". Portanto, os nomes de arquivos /usr/bin/yacc
e /usr/bin/bison
são correspondidos a diferentes números de inode, o que significa que esses dois nomes se referem a metadados diferentes e dados de arquivos diferentes. Falando casualmente, os arquivos não são hard links no sentido de que apenas um nome de arquivo corresponde a cada um dos inodes, mas a partir de um sentido técnico, ambos os nomes de arquivos são hard links, cada um deles é o único link rígido para o inode.
No que diz respeito ao seu script e aos "números de inode quase idênticos", yacc
e bison
estão relacionados. No meu laptop Arch:
1032 % ls -li /usr/bin/yacc /usr/bin/bison
1215098 -rwxr-xr-x 1 root root 394152 Jan 23 2015 /usr/bin/bison*
1215097 -rwxr-xr-x 1 root root 41 Jan 23 2015 /usr/bin/yacc*
1033 % file /usr/bin/yacc
/usr/bin/yacc: POSIX shell script, ASCII text executable
1034 % cat /usr/bin/yacc
#! /bin/sh
exec '/usr/bin/bison' -y "$@"
Os nomes dos arquivos yacc
e bison
identificam os números de inodes separados apenas um, provavelmente porque foram criados um após o outro. O nome do arquivo para yacc
não representa um link simbólico ou um link físico. Um link simbólico apareceria de forma diferente no ls -li
output, dois links físicos representariam o mesmo número de inode.
Mas yacc
está relacionado a bison
, pois é um script de shell que invoca bison
. É por isso que seu script fornece uma saída como:
bison (GNU Bison) 3.0.4
yacc is bison (GNU Bison) 3.0.4
Seu script invoca /usr/bin/yacc
, que na verdade apenas executa /usr/bin/bison
.