~ поведение оператора glob с пустым шаблоном

В документации ~ можно использовать в качестве оператора glob при установке EXTENDED_GLOB , что позволяет создавать такие конструкции, как

 print -rl glob*~globA*~glob*B 

так что все, что соответствует glob* но не соответствует globA* и glob*B
Отлично:

 touch file{1,2,3,4{,5}} setopt extendedglob 

Теперь

 print -rl file*~f*3~file4* 

ведет себя так, как ожидалось:

 file1 file2 

но при использовании пустого шаблона

 print -rl file*~f*3~~file4* 

печать

 file1 file2 file3 

Похоже, что только последний шаблон используется для фильтрации результатов 1-го шара (2-й и 3-й – пустые – игнорируются).

 print -rl file*~f*3~file4*~~ 

производит

 file1 file2 file4 file45 

так что теперь используется только второй …
Странно, что если шаблон после 1-й тильды пуст, он вообще не работает

 print -rl file*~~f*3~file4* 

ошибки с

 zsh: no matches found: file*~~f*3~file4* 

Что мне здесь не хватает?


это с zsh 5.3.1 если это имеет значение …

  • Могу ли я изменить способ отображения файла?
  • zsh: подстановка команды не наследует stdin из родительского
  • Что произойдет, если оболочка по умолчанию для пользователей не установлена?
  • таблица ключевых привязок?
  • Backspace в zsh застрял
  • Могу ли я перемещаться по меню закрытия zsh с помощью vi-подобных клавиш hjkl?
  • Получить индекс массива
  • Сделать zsh использовать readline вместо zle?
  • One Solution collect form web for “~ поведение оператора glob с пустым шаблоном”

    ~~ не использует пустой шаблон. Вместо этого он выполняет одну из двух задач:

    • В конце всего рисунка буквально соответствует « ~~ ».
    • В середине буквально совпадает с одним « ~ », затем переходит к следующему исключенному шаблону (то есть к букве ~ за которым следует оператор ~ ).

    Если мы расширим набор файлов несколькими дополнительными функциями, мы увидим, что это произойдет:

     touch file3~ file3~~ file4~ file4~~ 

    Теперь запустите вашу первую нечетную команду:

     print -rl file*~f*3~~file4* file1 file2 file3 file3~~ 

    file3~ был исключен, как и все три file4* s. file3~~ все еще существует, потому что он не соответствует f*3~ .

    Второй:

     print -rl file*~f*3~file4*~~ file1 file2 file3~ file3~~ file4 file45 file4~ 

    file4~~ только file4~~ , потому что это единственный соответствующий file4*~~ .

    Окончательный случай теперь имеет выход:

     print -rl file*~~f*3~file4* file3~ file3~~ 

    так как это два файла, соответствующие file*~ которые не соответствуют ни f*3 ни file4* .

    Возможно, это может быть ошибка синтаксического анализа, по крайней мере, для случая буквального-то-оператора, но я не вижу использования для пустого шаблона исключения, поэтому я не уверен, что еще он должен делать.

    Linux и Unix - лучшая ОС в мире.