2016-06-01 2 views
1

Я пытаюсь создать и использовать переменные Heredoc, как это,Heredoc без кавычек не расширяет параметры

#!bin/bash 
sudo su - postgres <<EOF 
IP="XYZ" 
echo "$IP" 
EOF 

Это не работает правильно, и я получаю пустую строку, как эхо. Но если я использую кавычки EOF как это,

#!bin/bash 
sudo su - postgres <<"EOF" 
IP="XYZ" 
echo "$IP" 
EOF 

Он работает. Может ли кто-нибудь объяснить это? Согласно тому, что я читал в man, поведение должно быть противоположным.

+0

Каков ваш выход для каждой команды? В первом переменная будет расширена, во втором - нет. Кроме того, переменная никогда не устанавливается, поскольку она рассматривается только как строка. – 123

+0

Обратите внимание, что проблема на самом деле является обратной задачей описания проблемы: здесь doc без кавычек _is_ параметры расширения! –

+0

, как я уже упоминал, единственным выходом является «echo», который дает пустую строку в первом и правильный вывод i.e 'XYZ' во втором. – wolfsgang

ответ

6

Оболочка оценивает документ без кавычек и выполняет переменную интерполяцию перед передачей ее команде (в вашем случае sudo). Поскольку IP не является определенной переменной в родительской оболочке, она расширяется до пустой строки.

С кавычками вы предотвращаете переменную интерполяцию родительской оболочкой, и поэтому оболочка, запущенная sudo, видит и расширяет переменную.

+0

О, круто, я переместил «IP» за пределы heredoc без кавычек и попытался получить к нему доступ, он работал по назначению. Спасибо, я понял это сейчас. – wolfsgang

+1

Также добавьте @wolfsgang, если вы хотите выборочно развернуть некоторые переменные из родительской оболочки, а некоторые определены в heredoc (в этом случае IP), вы можете избежать знака '' 'в' $ IP' с '\ '& сохранить слово EOF без кавычек. – anishsane

+0

@anishsane, спасибо за подсказку, это очень полезно. Определенно это будет иметь в виду. – wolfsgang