Por que a conclusão do bash de um symlink é diferente de um diretório?

4

Eu costumo fazer um find com uma variável de ambiente como o caminho ao pesquisar pelo código-fonte. Recentemente eu substituí minha variável de ambiente por um link simbólico, e isso quebrou a conclusão do shell do Bash. Quando eu faço um find usando o symlink ele não funciona, mas se eu usar o caminho real para o qual o link simbólico aponta, ele funciona.

ln -s /some/source/dir /the/source
export SYMLINK=/the/source
export DIR=/some/source/dir

find $SYMLINK -name file.c        // doesn't find anything
find $DIR -name file.c            // works as expected

Neste exemplo, $ SYMLINK é um link simbólico para o valor de $ DIR.

Então, por que o bash manipula variáveis de ambiente de link simbólico de maneira diferente?

    
por Mr. Shickadance 03.06.2011 / 17:52

2 respostas

5

Não é bash, é encontrar; embora você descubra que a maioria dos utilitários seguirá o mesmo princípio:

  • Se estiver operando no conteúdo do arquivo, um link simbólico para um arquivo normal é equivalente ao arquivo real.
  • Se estiver operando em entradas de diretório, os links simbólicos são uma categoria própria.

Quando você executa find $SYMLINK , find vê um objeto que não é um diretório, por isso não o percorre. Se você quiser tratar um link simbólico para um diretório como se fosse esse diretório, adicione um / no final (alguns sistemas ou comandos quebrados podem exigir "$SYMLINK/." ):

find "$SYMLINK/" -name file.c

Para find , você também pode usar a opção -H , que diz para tratar qualquer link simbólico na linha de comando como se você tivesse especificado o destino:

find -H "$SYMLINK" -name file.c
    
por 03.06.2011 / 18:25
3

Não é bash , é find . Seguir links simbólicos em uma passagem de diretório recursiva geralmente leva a loops infinitos (considere o truque comum de ln -s foo . fornecer um caminho de compatibilidade). POSIX find inclui o predicado -follow para substituir isso; talvez mais útil neste caso, o GNU find fornece -H para seguir apenas os links simbólicos diretamente especificados como parâmetros, enquanto continua a evitar a expansão de links simbólicos encontrados durante a travessia. Você poderia usá-los com um alias:

alias find='find -H'
    
por 03.06.2011 / 17:59