Neste post do Ask Ubuntu , usei o globstar para localizar um arquivo quando PATH
não está definido:
$ shopt -s globstar; for v in /**/vim; do [[ -x $v && -f $v ]] && echo "$v"; done
/etc/alternatives/vim
/usr/bin/vim
/usr/bin/X11/vim
Agora que penso nisso, essa saída parece um pouco estranha. /usr/bin/X11
é um link simbólico para /usr/bin
:
$ readlink /usr/bin/X11
.
Então, há uma recursão infinita de X11
s lá, mas apenas o primeiro deles apareceu na saída. Estranhamente, apenas um /usr/**
não desce em X11
nada:
$ printf "%s\n" /usr/bin/** | grep X11
/usr/bin/X11
Como conciliar a primeira e a última saída?
Dos comentários:
Estou usando o Bash versão 4.4.18(1) no Ubuntu 16.04.
tl; dr - A expansão Bash é complicada para evitar loops infinitos de links simbólicos (em
bash >= 4.3
), e você e eu interpretamos mal o que estava fazendo nos comandos que você postouPresumo que sim, pois
bash >= 4.3
não consigo reproduzir o que você descreve embash 4.2.46
, ele faz um loop até atingir um limite de recursão (como esperado).Olhei para isso por um tempo e configurei um diretório de teste para reproduzir que imitava sua situação. O cerne disso é como a expansão bash acontece em cada um de seus exemplos. A expansão se comporta de maneira diferente dependendo se é seguida ou não por um
/
, e há apenas alguma dissonância cognitiva nesse ponto para nós, primatas, ao olhar para exemplos como este.Da documentação do bash shopt :
Para ilustrar, aqui está minha configuração de teste:
resultando nesta estrutura de diretórios:
Isso duplica suas descobertas no meu diretório de teste:
No primeiro exemplo, o glob se expande para
(test/nested/looper, test/nested, test)
, parando emlooper
sem seguir o link porque o glob foi seguido por um/
Em seguida, anexamos
/sneaky
a isso, resultando no conjunto(test/nested/looper/sneaky, test/nested/sneaky, test/sneaky)
.No segundo exemplo, o glob se expande para
(test/nested/looper, test/nested/sneaky, test/nested, test/sneaky, test)
(que você pode verificar removendo o| grep sneaky
)Novamente, essa expansão não segue o
looper
link, mas neste caso não anexamos/sneaky
a ela, deixando../test/nested/looper/sneaky
de lado nossos resultados.Por outro lado, continuamos a obter
../test/nested/sneaky
e../test/sneaky
porque o glob também captura arquivos quando não é seguido por um/