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.

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


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.