Recomendamos que, em scripts bash, não analisemos a saída de ls
A página da Web vinculada acima recomenda códigos como:
# Good!
for f in *; do
[[ -e $f ]] || continue
...
done
ou para preencher uma matriz com nomes de arquivos
myfiles=( ~/* )
Mas quando olho para esses exemplos e sei como os shells bourne lidam com strings sem aspas em geral, minha sensação é que, se eu usasse esse código em nomes de arquivos contendo espaços, o glob explodiria cada palavra separada por espaço 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 eu recebo é 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?
É porque a expansão glob é feita após a divisão de palavras? (para que esses tipos de operações de arquivo produzam a saída correta?)
A expansão do nome do arquivo ocorre após a divisão de palavras
https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html#Shell-Expansions
[[ -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.