Pourquoi les fichiers globaux ne sont-ils pas sujets au fractionnement de mots?


2

Il est recommandé, dans les scripts bash, de ne pas analyser le résultat de ls

La page Web liée à ci-dessus recommande un code tel que:

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

ou pour remplir un tableau avec des noms de fichiers

myfiles=( ~/* )

Mais lorsque je regarde ces exemples et que je sais comment les coquilles traitent les chaînes non citées en général, j’ai l’impression que si j’utilisais ce code sur des noms de fichiers contenant des espaces, le glob exploserait tous les mots séparés par des espaces dans les fichiers. Par exemple, si j'ai le répertoire suivant

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

et je lance cette

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

J'attends un comportement de chaîne non entre guillemets. par exemple

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

Mais ce que je reçois, c'est le comportement correct

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

similaire pour les tableaux

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

Ma question est pourquoi est-ce?
Est-ce parce que l'expansion globale est faite après la séparation des mots? (afin que ces types d'opérations sur les fichiers produisent une sortie correcte?)

Réponses:



1

[[ -e $f ]]est un cas particulier. [[est un mot réservé; entre [[et ]]différentes règles sont en vigueur. L'une d'entre elles est qu'aucune division de mot n'est effectuée.


1
ah oui. mais si [ -e $f ]on utilisait, on séparerait les mots, non? Aussi, je pense que dans le [[ ]] contexte, le *caractère ne signifie pas les noms de fichiers du répertoire actuel, cela signifie "correspondance de modèle de chaîne"? par exempleif [[ $interface == wlp* ]]; then ...
the_velour_fog le

Right [fait partie d'une ligne de commande normale avec les règles d'expansion normales.
Hauke ​​Laging
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.