Por que o comando de marca da marca symlink é recursivo?

2

Eu tenho a seguinte árvore de diretórios:

.
└── aaa
    └── bbb
        └── ccc

E crie um link simbólico:

ln -s ~/test/aaa/bbb slink

Depois disso eu executo o comando tree:

tree -l

e veja

.
├── aaa
│   └── bbb
│       └── ccc
└── slink -> /home/kaa/test/aaa/bbb  [recursive, not followed]

Por que o slink é marcado como recursivo? É um bug ou eu estou entendendo mal alguma coisa?

    
por KaHa 13.04.2018 / 14:58

1 resposta

2

Você usou a opção -l :

Follows symbolic links if they point to directories, as if they were directories. Symbolic links that will result in recursion are avoided when detected.

Agora, a razão pela qual ele imprime esse aviso não é que ele realmente recurse. Podemos ver claramente que seria simplesmente listar novamente a árvore bbb/ccc .

Meu palpite é que o verdadeiro problema é o problema de parada : o tree O comando não pode saber se irá ou não reciclar infinitamente, portanto, ele deve parar quando detectar um link simbólico para um diretório que já tenha visitado - mesmo que seguir esse diretório seria apenas imprimir uma subárvore e não reciclar.

Mesmo se você puder interromper cedo ou depois de um número predefinido de recursões, tudo isso será feito para não consumir quantidades infinitas de memória. Pelo menos essa é a minha interpretação.

O código respectivo é aqui , a propósito. Se o número de inode do diretório apontado pelo symlink for encontrado na tabela de hash (aquela que é preenchida com saveino e findino ), ele simplesmente irá ignorá-lo.

    
por 13.04.2018 / 15:45

Tags