Почему 'eval "MYVALUE = mystring" export MYVALUE "работает только из bash, а не из zsh? - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь выяснить, почему следующая команда работает только с bash, а не с zsh:

Bash:

bash-3.2$ eval "MYVALUE=mystring" export MYVALUE
bash-3.2$ echo $MYVALUE
mystring

Zsh:

➜  ~ eval "MYVALUE=mystring" export MYVALUE
➜  ~ echo $MYVALUE

➜  

Я ожидал, что zsh напечатает mystring, но вместо этого он ничего не печатает.

Похоже, export не может прочитать значение, которое было только что проанализировано, но эффективно eval работает, потому что, если я запускаю эту другую команду, используя zsh:

➜  ~ eval "MYVALUE=mystring" env | grep MYVALUE
MYVALUE=mystring

работает как положено!

Может кто-нибудь помочь мне выяснить, почему функция eval / export не работает с zsh, но работает с bash и как в конечном итоге заставить ее работать также с zsh? Большое вам спасибо!

Ответы [ 2 ]

0 голосов
/ 16 января 2019

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

eval "MYVALUE=mystring"; export MYVALUE

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

0 голосов
/ 16 января 2019

Разница между 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.

...