2012-05-04 2 views
4

Quelle est la manière la plus élégante d'utiliser la variable shell (BASH) contenant des caractères réservés à la globbing (achèvement du nom de fichier) qui déclenche des substitutions indésirables? Voici l'exemple:Empêcher la globalisation après la substitution de variables

for file in $(cat files); do 
    command1 < "$file" 
    echo "$file" 
done 

Les noms de fichiers contiennent des caractères comme '[' ou ']'. J'ai essentiellement deux idées:

1) Désactiver le jokers jeu -f: J'ai besoin un autre endroit

2) échapper les noms de fichiers dans les fichiers: BASH se plaint de « fichier introuvable » lorsque la tuyauterie dans stdin

Thx pour toute suggestion

Edit: la seule réponse manquante est à lire à partir d'un fichier dont le nom contient des caractères spéciaux utilisés pour englobement lorsque le nom de fichier est dans une variable shell « $ file », e. g. command1 < "$ fichier".

Répondre

1

Utilisez plutôt while read.

cat files | while read file; do 
    command1 < "$file" 
    echo "$file" 
done 
+0

Ceci est un bien indice, merci. Cela empêchera la globalisation dans la construction de la liste de la boucle for. Mais les deux lignes d'exécution vont toujours déclencher la globalisation après la substitution de variables. – fungs

4

Vous pouvez désactiver les jokers avec set -f, puis rallumez plus tard dans le script avec set +f.

+0

Cela fonctionne probablement, mais si vous devez désactiver et activer la fonction de globalisation dans chaque cycle d'une boucle, il n'est pas élégant. – fungs

8

Comme alternative à la commutation entre set -f et set +f vous pourriez peut-être appliquer un seul set -f à un sous-shell depuis l'environnement de la coquille mère ne serait pas par touchés par du tout:

(
set -f 
for file in $(cat files); do 
    command1 < "$file" 
    echo "$file" 
done 
) 


# or even 

sh -f -c ' 
    for file in $(cat files); do 
     command1 < "$file" 
     echo "$file" 
    done 
' 
Questions connexes