man bash
СЕРЕДОВИЩЕ
[...] Навколишнє середовище для будь-якої простої команди чи функції може бути тимчасово доповнене, додавши її до призначення параметрів, як описано вище в PARAMETERS. Ці заяви про присвоєння впливають лише на середовище, яке бачить ця команда.
Змінні розширюються до того, як відбудеться призначення змінної. З очевидної причини, яка var=x
працювала б і іншим шляхом, але var=$othervar
не буде. Тобто ваш $x
потрібен до того, як він буде доступний. Але це не головна проблема. Основна проблема полягає в тому, що командний рядок може змінюватися тільки середовищем оболонки, але призначення не стає частиною середовища оболонки.
Ви змішуєте функції: Ви хочете замінити командний рядок, але помістіть змінне визначення у середовище команд. Заміна командного рядка повинна бути виконана оболонкою. Навколишнє середовище повинно бути явно використане викликаною командою. Буде і як це робиться, залежить від команди.
Перевага цього використання полягає в тому, що ви можете встановити середовище для підпроцесу, не впливаючи на середовище оболонки.
x="once upon" y="a time" bash -c 'echo $x $y'
працює так, як ви очікували, оскільки в цьому випадку обидві функції поєднуються: Заміна командного рядка здійснюється не оболонкою, що викликає, а оболонкою підпроцесу.