zsh: разбор подстановочных знаков в переменных, используемых в аргументах команд zsh?

#shell #variables #terminal #zsh #wildcard

#оболочка #переменные #терминал #зш #подстановочный знак #zsh

Вопрос:

ls *.txt показывает все файлы, имя которых заканчивается на .txt

Однако, если я сделаю следующее в оболочке zsh: (в моем случае на macOS 10.15 Catalina)

 a=*.txt
b='*.txt'
c="*.txt"

# trying no quotes, single quotes, double quotes
# although doesn't make any difference here

ls $a
ls $b
ls $c
ls "$a"
ls "$b"
ls "$c"
  

Я получаю

ls: *.txt: нет такого файла или каталога

во всех случаях. Как мне включить подстановочные знаки в переменную, а затем заставить команды типа ls фактически обрабатывать ее как подстановочные знаки, а не буквенные символы?

Ответ №1:

Вы должны использовать ~ (тильду) между $ и именем переменной, чтобы выполнить глобализацию в zsh. Это

 ls $~a
  

Комментарии:

1. Обратите внимание, что результатом этого является временное включение GLOB_SUBST расширения для этого одного параметра; вы также можете установить параметр с помощью setopt GLOB_SUBST для применения ко всем последующим расширениям параметров.

Ответ №2:

Вы можете включить подстановочные знаки в zsh с помощью команды:

unsetopt nomatch

Если вы хотите сделать изменение постоянным, поместите приведенную выше команду в свой .zshrc файл.