Символ =
не является метасимволом.
Давайте сначала начнем с первого упоминания о присвоении переменной: Раздел 3.4 Параметры оболочки :
A параметр - это объект, который хранит значения. Это может быть name
, число [для позиционных параметров $0
, $1
, et c.] Или один из специальных символов, перечисленных ниже. переменная - это параметр, обозначаемый name
. Переменная имеет атрибуты значение и ноль или более . [...]
Параметр устанавливается, если ему было присвоено значение. Нулевая строка является допустимым значением. Как только переменная установлена, она может быть сброшена только с помощью встроенной команды unset
.
Переменная может быть назначена оператором вида
name=[value]
Если значение не задано, переменной присваивается нулевая строка. Все значения в go расширение тильды, расширение параметров и переменных, подстановка команд, расширение арифметики c и удаление кавычек (подробно описано ниже).
(текст в мое дополнение - квадратная скобка).
И нет никаких упоминаний о том, что name
проходит через какие-либо расширения.
Кстати, name
определяется как :
Слово, состоящее исключительно из букв, цифр и подчеркиваний, и начинающееся с буквы или подчеркивания. Имена используются как имена переменных и функций оболочки. Также называется идентификатором.
Если мы продолжим чтение, мы получим Раздел 3.7.1 Простое расширение команд , где мы читаем:
Когда выполняется простая команда, оболочка выполняет следующие расширения, назначения и перенаправления слева направо.
- Слова, которые синтаксический анализатор пометил как назначения переменных (предшествующие имя команды) и перенаправления сохраняются для последующей обработки.
- Раскрыты слова, которые не являются назначениями переменных или перенаправлениями (см. Расширения оболочки ). Если после раскрытия остаются какие-либо слова, первое слово считается именем команды, а остальные слова являются аргументами.
- Перенаправления выполняются, как описано выше (см. Перенаправления ).
- Текст после '=' в каждом назначении переменной подвергается расширению тильды, расширению параметров, подстановке команд, арифметическому расширению и удалению кавычек перед присвоением переменной.
И снова, только значение подвергается расширению.
Теперь, используя спецификации POSIX, Раздел 2.10.2 Правила грамматики оболочки упоминает:
[Назначение имени предшествующей команды]
a. [Когда первое слово]
Если TOKEN не содержит символ '=', применяется правило 1. В противном случае применяется 7b.
b. [Не первое слово]
Если TOKEN содержит символ без кавычек (как определено при применении правила 4 из распознавания токенов), который не является частью раскрытия встроенного параметра, подстановки команды или конструкции расширения арифметики c (как определено при применении правила 5 из Распознавания токенов):
Если TOKEN начинается с '=', то должно применяться правило 1.
Если все символы в TOKEN, предшествующие первой такой форме, имеют действительное имя (см. Имя XBD ), должен быть возвращен токен ASSIGNMENT_WORD.
В противном случае не указано, применяется ли правило 1 или возвращается ASSIGNMENT_WORD.
c. В противном случае должно применяться правило 1.
Назначение имени в возвращенном токене ASSIGNMENT_WORD должно происходить, как указано в Простых командах.
где допустимое имя определяется как :
В языке команд оболочки - слово, состоящее только из подчеркиваний, цифр и алфавитов из переносимого набора символов. Первый символ имени не является ди git.