Comment obtenir silencieusement une chaîne vide à partir d'un modèle glob sans correspondance

24

Disons que j'ai un dossier avec trois fichiers:

foo1
foo2
bar

1. Si je cours

list_of_files=$(print foo*)
echo $list_of_files

Je reçois: foo1 foo2

2. Si je cours

list_of_files=$(print bar*)
echo $list_of_files

Je reçois: bar

3. Cependant, si je cours

list_of_files=$(print other*)
echo $list_of_files

J'obtiens: zsh: no matches found: other*(la variable $list_of_filesest vide cependant)


Existe-t-il un moyen de demander à zsh de ne pas se plaindre s'il ne peut pas correspondre à une expansion globale?

Mon objectif est d'utiliser le mécanisme ci-dessus pour collecter silencieusement une liste de fichiers qui correspondent à un modèle global donné.

Amelio Vazquez-Reina
la source

Réponses:

33

Activez l' null_globoption pour votre modèle avec le Nqualificatif glob.

list_of_files=(*(N))

Si vous faites cela sur tous les modèles d'un script ou d'une fonction, activez l' null_globoption:

setopt null_glob

Cette réponse a des équivalents bash et ksh.

Ne pas utiliser printou remplacer la commande! Cela génère une chaîne composée des noms de fichiers avec des espaces entre eux, au lieu d'une liste de chaînes. (Voir Qu'est-ce que le fractionnement de mots? Pourquoi est-il important dans la programmation shell? )

Gilles 'SO- arrête d'être méchant'
la source
15

La meilleure façon: for a in *(.N); do ... ; done. L'option N oblige zsh à livrer une liste vide à for et for itérera zéro fois.

Attention ls *.foo(.N); lorsque ls reçoit une liste d'arguments vide, il répertorie tous les fichiers au lieu d'aucun. C'est pourquoi je n'aime pas NULL_GLOB (ou son équivalent bash): il change tous les globs et rompt facilement les appels à par exemple ls.

arnt
la source
Envie de voir votre réponse ici @arnt, c'est exactement ce dont j'avais besoin.
gtd
Pourquoi .dans (.N)? D'autres réponses ont (N)à elles seules, quelle est la différence?
Michael Dorst
La question portait sur les fichiers et .restreint le glob à ne faire correspondre que les fichiers.
Arnt
4

Je pense que vous cherchez l' NULL_GLOBoption:

   NULL_GLOB (-G)
          If a pattern for filename generation has no matches, delete  the
          pattern  from  the  argument list instead of reporting an error.
          Overrides NOMATCH.
enzotib
la source
-1

Essayez de cette façon:

list_of_files=$(print other*) 2>/dev/null

Il redirigera la sortie d'erreur de stderr vers / dev / null et ne s'affichera pas.

se ruer
la source
Ça ne marche pas du tout.
Pablo Olmos de Aguilera C.