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