Использование локального параметра с тем же именем специального в функции - PullRequest
0 голосов
/ 02 января 2019

Поскольку мне нравится использовать описательные имена параметров, я часто пытался использовать имена переменных, уже используемые самим Zsh.

Поскольку в прошлом у меня возникли проблемы, я теперь обернул свой сценарий в main функция, названная в честь скрипта.Затем я объявляю все свои локальные параметры с помощью ключевого слова local.

Но некоторые параметры, кажется, не позволяют скрыть их в локальной области видимости:

function foo
{
    local commands=(bar baz)
    local status=0

    echo ${(F)commands}
    echo $status
}

Здесь локальный commandsпараметр используется вместо специального.

Но так как параметр status только для чтения, я получил следующую ошибку:

zdm: 6: только для чтенияпеременная: status

Я думаю, что ключевое слово local позволяет использовать специальный параметр в локальной области видимости, но оно не меняет способ его объявления.

1 Ответ

0 голосов
/ 02 января 2019

Чтобы использовать специальное имя параметра в локальной области, вы должны скрыть его явно , используя флаг -h встроенного typeset:

typeset -h status

Как вычтобы объявить его как локальный, используйте ключевое слово local, которое также поддерживает этот флаг:

local -h status

Вы также можете использовать ключевое слово private из модуля zsh/param/private:

zmodload zsh/param/private

private -h status

Флаг -h

Из руководства Zsh:

-h

Скрыть: полезно только для специальных параметров (отмеченных <S>в таблице в параметрах, установленных оболочкой), и для локальных параметров с тем же именем, что и у специального параметра, но безвредно для других.

Специальный параметр с этим атрибутом не сохранит своего специального эффектакогда сделал местный .Таким образом, после typeset -h PATH функция, содержащая typeset PATH, создаст обычный локальный параметр без обычного поведения PATH.

В качестве альтернативы, локальному параметру самому может быть присвоен этот атрибут ;следовательно, внутри функции typeset -h PATH создается обычный локальный параметр, и специальный параметр PATH никак не изменяется.

Можно также создать локальный параметр, используя typeset +h special, где локальная копия специальногосохранит свои специальные свойства независимо от наличия атрибута -h.

Глобальные специальные параметры, загружаемые из модулей оболочки (в настоящее время они находятся в zsh / mapfile и zsh / parameter), автоматически получают атрибут -h, чтобы избежать конфликтов имен.

Локальные параметры

Для более понятного объяснения см. Справочную страницу Zsh о локальных параметрах .

...