Расширение $ параметров выполняется перед выполнением команды с использованием текущей среды.
Назначение параметра не выполняется автоматически export это для дочерних процессов (команд), но только при последующих вызовах команд (в их командной строке, согласно правилу # 1).
Но команда в форме «команда a = b» имеет назначение, которое экспортируется в команду, но только временно - только для этого вызова одной команды.
Учитывая три приведенных выше правила:
❯❯❯ b = 1 эхо $ b
сначала переводится в: b = 1 эхо ""
... и ничего не печатается.
b = 1; echo $ b
работает, потому что есть две разные команды, как если бы они были помещены в две разные строки. Первый раскрывается и устанавливает переменную; затем второй раскрывается.
#!/bin/bash
echo $a
(этот скрипт печатает $ a, найденный в среде).
❯❯❯ a = 1 ./gen.sh
Это работает, потому что экспортируется a = 1, поэтому gen. sh находит его в среде.
❯❯❯ a = 1; ./gen.sh
Это не работает, потому что = 1 установлено, но не экспортировано в дочерние процессы; поэтому gen. sh запускается, но не находит $ a в окружении. Вместо этого будет работать следующее:
❯❯❯ export a = 1; ./gen.sh