I считают , что имена переменных не хранятся в файлах pyc / pyd / pyo, поэтому вы не можете получить точные строки кода, если у вас нет исходных файлов.
Разница между bash и zsh в этом отношении не связана с eval, но в тонкой разнице, связанной с экспортом .
Вы выполняете eval
с 3 параметрами:
"MYVALUE=mystring"
export
MYVALUE
Теперь страница man 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 в первую очередь.
После небольшой попытки и ошибки и благодаря подсказке @ glenn-jackman я могу сказать, что возможное решение, которое работает как с bash
, так и с zsh
, это:
eval "MYVALUE=mystring"; export MYVALUE
В основном нам нужно добавить ;
до export