printf interpretação do curinga do comando

3

Eu estou querendo saber qual comportamento o comando printf segue ao usar curingas. Esta pergunta foi originalmente feita a mim por outra pessoa, mas estou confuso com o comportamento e adoraria uma explicação que me ajude a entender como o comando printf funciona.

Dado o seguinte diretório:

$ ls -a  
.a  a.b  ab.c  b  .b  b.a  b.c  c  c.d  d  d.e  e

$ printf [abcd]*[abcd] produzirá a.b . $ ls [abcd]*[abcd]

a.b:    

ab.c:    

b.a:      

b.c:      

c.d:   
    

como saída e $ echo [abcd]*[abcd] resulta em a.b ab.c b.a b.c c.d

Por que o printf tem uma saída diferente? Está relacionado às prioridades de expansão regex / shell?

    
por Nick Dewitte 17.01.2018 / 21:27

1 resposta

3

Use set -x para ver o que o comando realmente é depois que o shell o expande. Acontece que

printf [abcd]*[abcd]

em seu diretório é de fato

printf a.b ab.c b.a b.c c.d

Agora, printf trata a.b como FORMATO (consulte man 1 printf ) . Não inclui %s nem nada disso, é por isso que o restante dos argumentos não importam e o literal a.b é impresso.

Se você quiser que printf se comporte mais como echo , especifique o formato desejado, por exemplo:

printf '%s\n' [abcd]*[abcd]

imprimirá

a.b
ab.c
b.a
b.c
c.d

(Nota: use set +x para reverter set -x depois de concluir o teste.)

    
por 17.01.2018 / 21:39