Jak po cichu uzyskać pusty ciąg z globalnego wzorca bez dopasowań

24

Powiedzmy, że mam folder z trzema plikami:

foo1
foo2
bar

1. Jeśli biegnę

list_of_files=$(print foo*)
echo $list_of_files

Dostaję: foo1 foo2

2. Jeśli biegnę

list_of_files=$(print bar*)
echo $list_of_files

Dostaję: bar

3. Jednak jeśli uruchomię

list_of_files=$(print other*)
echo $list_of_files

Otrzymuję: zsh: no matches found: other*(zmienna $list_of_filesjest pusta)


Czy istnieje sposób, aby poprosić Zsh, aby nie narzekał, jeśli nie może się równać z ekspansją globalną?

Moim celem jest użycie powyższego mechanizmu do cichego zebrania listy plików pasujących do danego wzorca globu.

Amelio Vazquez-Reina
źródło

Odpowiedzi:

33

Włącz null_globopcję swojego wzorca w Nkwalifikatorze glob.

list_of_files=(*(N))

Jeśli robisz to dla wszystkich wzorców w skrypcie lub funkcji, włącz null_globopcję:

setopt null_glob

Ta odpowiedź ma odpowiedniki bash i ksh.

Nie używaj printani nie zastępuj poleceń! To generuje ciąg składający się z nazw plików ze spacjami między nimi, zamiast listy ciągów. (Zobacz Co to jest dzielenie słów? Dlaczego jest to ważne w programowaniu powłoki? )

Gilles „SO- przestań być zły”
źródło
15

Lepszy sposób: for a in *(.N); do ... ; done. Opcja N sprawia, że ​​zsh dostarcza pustą listę dla, a dla iteruje zero razy.

Uważaj na ls *.foo(.N); kiedy ls otrzymuje pustą listę argumentów, wyświetla listę wszystkich plików zamiast żadnego. Dlatego nie lubię NULL_GLOB (lub jego odpowiednika bash): Zmienia wszystkie globusy i łatwo przerywa wywołania np. Ls.

arnt
źródło
Masz ochotę zobaczyć twoją odpowiedź tutaj @arnt, właśnie tego potrzebowałem.
gtd
Dlatego .w (.N)? Inne odpowiedzi (N)same w sobie, jaka jest różnica?
Michael Dorst
Pytanie dotyczyło plików i .ogranicza glob do dopasowania tylko plików.
Arnt
4

Myślę, że szukasz NULL_GLOBopcji:

   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
źródło
-1

Wypróbuj w ten sposób:

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

Przekieruje wyjście błędu ze stderr do / dev / null i nie wyświetli się.

pośpiech
źródło
To w ogóle nie działa.
Pablo Olmos de Aguilera C.