Por que os globs não estão sujeitos à divisão de palavras?

2

Recomendamos que, nos scripts bash, não possamos analisar a saída de ls

A página da web vinculada acima recomenda código como:

# Good!
for f in *; do
    [[ -e $f ]] || continue
    ...
done

ou para preencher uma matriz com nomes de arquivos

myfiles=( ~/* )

Mas quando eu olho para esses exemplos, e sabendo como bourne shells lidam com strings não-citadas em geral, minha sensação é que se eu usasse esse código em nomes de arquivos contendo espaços, o glob explodiria cada espaço separado - palavra nos arquivos . por exemplo. Se eu tiver o seguinte diretório

$ ls -1  
a file I downloaded from the net.pdf
apple.sh
hello world.txt

e eu corro isso

for file in *
    do printf "%s\n" "$file"
done

Estou esperando um comportamento de string sem aspas. por exemplo,

a
file
I
downloaded
from
the
net.pdf
apple
hello
world

Mas o que obtenho é o comportamento correto

a file I downloaded from the net.pdf
apple
hello world

semelhante para matrizes

myfiles=( * )
declare -p myfiles
declare -a myfiles='([0]="a file I downloaded from the net.pdf" [1]="apple" [2]="hello world")'

Minha pergunta é por que isso acontece?
É porque a expansão glob é feita após a divisão de palavras? (para que esses tipos de operações de arquivo produzam resultados corretos?)

    
por the_velour_fog 17.01.2018 / 01:12

2 respostas

8

A expansão do nome do arquivo ocorre após a divisão de palavras

link

The order of expansions is: brace expansion; tilde expansion, parameter and variable expansion, arithmetic expansion, and command substitution (done in a left-to-right fashion); word splitting; and filename expansion.

    
por 17.01.2018 / 01:23
1

[[ -e $f ]] é um caso especial. [[ é uma palavra reservada; entre [[ e ]] regras diferentes estão em vigor. Uma delas é que nenhuma divisão de palavras é realizada.

    
por 17.01.2018 / 01:37