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é.

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


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.


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.

-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.


Ça ne marche pas du tout.
Pablo Olmos de Aguilera C.
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.