расширение имени файла при назначении переменной, не являющейся массивом - PullRequest
1 голос
/ 30 апреля 2020

Это примерно Zsh 5.5.1.

Скажем, у меня есть шаблон glob, который расширяется до одного файла, и я хотел бы назначить этот файл переменной. Это работает:

# N: No error if no files match. D: Match dot files. Y1: Expand to exactly one entry.
myfile=(*(NDY1)) 

и echo $myfile покажет файл (или каталог). Но этот не работает:

myfile=*(NDY1)

В последнем случае echo $myfile содержит шаблон, то есть *(NDY1).

Конечно, я мог бы сделать несколько дешевых трюков, таких как создание chilprocess через

myfile=$(echo *(NDY1))

но есть ли способ выполнить задание без таких уловок?

1 Ответ

2 голосов
/ 01 мая 2020

По умолчанию zsh не выполняет расширение имени файла в скалярном присваивании, но может помочь опция GLOB_ASSIGN . (Эта опция предоставляется только для обратной совместимости.)

local myfile=''
() {
  setopt localoptions globassign
  myfile=*(NDY1)
}
echo $myfile
;#>> something

Вот некоторые описания в zsh документах:

Также может быть назначено значение скалярного параметра записав:
name=value
При скалярном присваивании значение раскрывается как одна строка, в которой элементы массивов объединяются; расширение имени файла не выполняется, если не установлена ​​опция GLOB_ASSIGN .

--- zshparam (1), Description, zsh параметры


GLOB_ASSIGN
Если эта опция установлена, генерация имени файла (глобализация) выполняется справа от скалярных назначений параметров формы ' name=pattern (например, foo=* '). Если результат содержит более одного слова, параметр станет массивом с этими словами в качестве аргументов. Эта опция предусмотрена только для обратной совместимости: глобализация всегда выполняется справа от присвоений массивов вида name=(value) (например, foo=(*)), и эта форма рекомендуется для ясности; с этой установленной опцией невозможно предсказать, будет ли результат массивом или скаляром.

--- zshoptions (1), GLOB_ASSIGN, Расширение и глобализация, Описание опций zsh опции

...