Разница между bash и zsh в этом отношении не связана с eval, но в тонкой разнице, связанной с export .
Вы выполняете eval
с 3 параметрами:
"MYVALUE=mystring"
export
MYVALUE
Теперь страница руководства zsh (по крайней мере, моей версии zsh) немного вводит в заблуждение в описании того, что делает eval, когда он вызывается с более чем аргументом, но простой эксперимент показывает, что происходит:
eval 'A=BBBBBB' 'printenv A'
выходы BBBBBB . Фактически, eval, похоже, объединяет свои аргументы в одну строку, но разделяет части на пробел. Следовательно, в вашем случае,
eval "MYVALUE=mystring" export MYVALU
эквивалентно
eval "MYVALUE=mystring export MYVALU"
что в свою очередь просто
MYVALUE=mystring export MYVALU
а вот разница между bash и zsh:
Находясь в обеих оболочках, выписка вида
A=B C
выполняет C, где в измененной среде, где A установлено на B, bash export является командой и «видит» измененную среду. Это означает, что в
A=B export A
команда bash export "видит" настройку A и экспортирует переменную. В zsh экспорт - это просто ключевое слово, а измененное окружение игнорируется.
Следовательно, вам нужны два отдельных оператора в zsh, например
eval "MYVALUE=mystring;" export MYVALUE
или переписать его как
eval export "MYVALUE=mystring"
Конечно, это оставляет вопрос, почему вы используете eval.