Por que 'ls -L' imprime o nome do link em si, não o nome do arquivo para o qual o link aponta?

4

Ao executar uma listagem "longa" de um link, ls -l exibe os atributos do arquivo do link. Ao executar ls -lL (ou ls -l --dereference ), os atributos do arquivo são aqueles do arquivo para o qual o link aponta, mas ls ainda imprime o nome do próprio link. A página man não diz nada sobre isso. A página info em ls apenas diz que " ls ainda imprime o nome do link em si, não o nome do arquivo para o qual o link aponta", sem uma explicação sobre o motivo. Suponho que essa seja uma escolha deliberada, mas alguém conhece a lógica por trás desse comportamento de ls -L ?

    
por twan163 02.01.2017 / 21:45

2 respostas

8

Porque o nome do arquivo na outra extremidade do link não é (ou pode não ser) o nome do arquivo no diretório que você está acessando com ls .

Dois problemas com a exibição do nome do destino do link simbólico no lugar do nome do próprio link:

  1. O arquivo não existe. Se o nome do destino do link simbólico for exibido na listagem do diretório, você pode ser levado a acreditar que esse é o nome do arquivo nesse diretório, mas não é. O nome do destino não é o nome pelo qual você acessa o arquivo nesse diretório; o arquivo com esse nome de arquivo não existe (nesse diretório) ou, na pior das hipóteses, pode ser um arquivo totalmente diferente (ou um diretório, ou qualquer outro) quando acessado por esse nome.

  2. Os arquivos podem parecer ter nomes idênticos. Se o nome do destino do link simbólico for exibido, você poderá descobrir que é exatamente idêntico a outro nome de arquivo nesse diretório, o que não pode ser verdadeiro em um sistema Unix.

Nesses casos, isso causa confusão para os usuários e eles precisariam verificar a listagem usando ls sem -L , o que tornaria a opção -L bastante inútil.

Isto ( não exibindo o nome do alvo) também é o comportamento especificado pelo POSIX, explicitamente:

Evaluate the file information and file type for all symbolic links (whether named on the command line or encountered in a file hierarchy) to be those of the file referenced by the link, and not the link itself; however, ls shall write the name of the link itself and not the file referenced by the link. When -L is used with -l, write the contents of symbolic links in the long format (see the STDOUT section).

Não há mais discussão sobre isso na seção Justificativa do POSIX ls manual .

    
por 02.01.2017 / 21:54
2

A justificativa para os links simbólicos continuarem mostrando o nome do link e não o vinculado ao nome do arquivo quando as opções -L ou -H são usadas é consistente.

Uma diferença notável entre links simbólicos e links físicos é que, quando listados com ls -l , as permissões de links simbólicos são de pouca utilidade (fora do s inicial) e o nome do arquivo mostra o nome do link e o vinculado ao nome do caminho usando a convenção symlink -> target . A lógica desse comportamento é que o comando ls -l funciona independentemente de o destino existir ou não. Seu papel é fornecer informações sobre o link simbólico em si.

A opção -L foi adicionada para permitir um comportamento semelhante ao que acontece com um link físico. As permissões de arquivo são as reais, ou seja, aquelas do inode subjacente, e o nome do arquivo é o que está sendo consultado, e não algo diferente. Isso seria confuso se você executasse, por exemplo, ls -lL a* e nomes de arquivos que não iniciassem com a seriam exibidos. Além disso, se o link de destino não existir, não haverá permissões para exibição porque não há inode subjacente e o comando ls -lL falhará em erro.

Outra boa razão para explicar por que isso é feito é que um link simbólico é frequentemente associado a um caminho relativo ou absoluto, não um único nome de arquivo, mas não há provisão para exibir um caminho relativo ou completo com ls -l , somente nomes de arquivos simples, sem barras nem pontos…

    
por 02.01.2017 / 23:33

Tags