Mostra o conteúdo do link simbólico

0

Em zsh , faço um link simbólico

$ ln -s ~/Documents symboliclink

e depois quero saber o que há dentro desse link simbólico.

$ ls -l symboliclink
> lrwxrwxrwx 1 user user 21 Oct 10 15:56 symboliclink -> /home/user/Documents

Isso mostra apenas o link simbólico, não o que está dentro dele. Se eu usar ls apenas, ele listará o conteúdo, mas se eu usei o -l , ele não. Isso funciona em bash para ls e ls -l . Como posso obter esse comportamento em zsh também?

    
por pfnuesel 10.10.2016 / 16:00

4 respostas

4

Uma causa provável para a aparente diferença na saída de ls -l entre zsh e bash é o uso de Tab -completion com AUTO_REMOVE_SLASH ativado em zsh (que é o padrão).

AUTO_REMOVE_SLASH <D>

When the last character resulting from a completion is a slash and the next character typed is a word delimiter, a slash, or a character that ends a command (such as a semicolon or an ampersand), remove the slash.

Ao digitar ls -l symb Tab , ambos zsh e bash concluirão isso para ls -l symboliclink/ (observe o / no final). A diferença é que zsh (com habilitado AUTO_REMOVE_SLASH ) irá remover a barra, se você simplesmente pressionar Enter (ou seja, encerrar o comando) lá.

Assim, você executará efetivamente ls -l symboliclink/ em bash , o que informará ls -l a procurar por trás do link. Mas em zsh você executará ls -l symboliclink , informando ao ls -l que você deseja ver as informações sobre o link e não sobre o diretório de destino.

ls sem opção -l sempre mostrará o conteúdo do diretório de destino, independentemente de haver / no final ou não.

Para que o zsh não remova a barra no final, basta digitar explicitamente após TAB -completion. Geralmente isso não irá alterar visivelmente o texto completo, mas se você digitar um espaço ou confirmar o comando, o / permanecerá. "Geralmente" porque é possível definir um realce para caracteres de sufixo adicionados automaticamente, por exemplo, magenta e negrito:

zle_highlight[(r)suffix:*]="suffix:fg=magenta,bold"

( Observação: isso pode não funcionar ao usar o plug-in de realce de sintaxe do ZSH )

Outra solução é (obviamente) desabilitar AUTO_REMOVE_SLASH . Isso pode ser feito com

setopt noautoremoveslash
    
por 11.10.2016 / 09:20
4

Basta adicionar um '/' no final.

ls -l symboliclink/
    
por 10.10.2016 / 16:06
4

Esta é a ls option -H :

ls -lH  symboliclink

De man 1p ls :

-H

If a symbolic link referencing a file of type directory is specified on the command line, ls shall evaluate the file information and file type 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.

Observe também a opção -L

-L

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).

    
por 10.10.2016 / 17:53
2

O comportamento do programa ls não depende do shell que o chama. Se você observar um comportamento diferente com ls no bash e no zsh, é porque você tem um alias (ou função) chamado ls em um dos shells, mas não no outro. O comportamento que você está observando em zsh corresponde ao que o ls faz, então você deve chamá-lo com opções adicionais no bash.

Você pode ter aliased ls a ls -H ou ls -L , para fazer com que seja desreferenciada links simbólicos. Esta é uma má idéia porque você não pode obter informações sobre os links simbólicos, além de ignorar o alias ( \ls ).

Quando um arquivo é um link simbólico para um diretório, você pode agir no diretório em vez do arquivo, adicionando uma barra no final: ls -l symboliclink/ é equivalente a ls -l symboliclink/. . Veja Quando um link simbólico é tratado como o link e como um link simbólico?

    
por 11.10.2016 / 02:06

Tags