Почему eval & ldquo; MYVALUE = mystring & rdquo; экспорт MYVALUE 'работает только с Bash, а не Zsh?

I считают , что имена переменных не хранятся в файлах pyc / pyd / pyo, поэтому вы не можете получить точные строки кода, если у вас нет исходных файлов.

1
задан Andrea Grandi 15 January 2019 в 16:45
поделиться

2 ответа

Разница между 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 в первую очередь.

0
ответ дан user1934428 15 January 2019 в 16:45
поделиться

После небольшой попытки и ошибки и благодаря подсказке @ glenn-jackman я могу сказать, что возможное решение, которое работает как с bash, так и с zsh, это:

eval "MYVALUE=mystring"; export MYVALUE

В основном нам нужно добавить ; до export

0
ответ дан Andrea Grandi 15 January 2019 в 16:45
поделиться