Коротше кажучи, використовуйте:
- без котирування ключових слів heredoc, наприклад,
EOF
- звичайні доларові знаки для зовнішніх (тобто локальних ) змінних, наприклад,
$FOO
- уникнув доларових знаків для внутрішніх (тобто віддалених ) змінних, наприклад
\$BAR
Якщо ви залишите ключове слово heredoc (тобто EOF) без котирування, то тіло heredoc обробляється локально, так що $FOOвоно розгорнуте fooі BARрозшириться до порожнього рядка. Тоді ваша sshкоманда стає:
BAR="bar"
echo "FOO=foo"
echo "BAR="
Якщо ви цитуєте ключове слово heredoc, тоді змінне розширення придушується, так що ваша sshкоманда замість цього стає:
BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"
Оскільки FOO, ймовірно, не визначено у віддаленому середовищі оболонки, вираз "FOO=$FOO"оцінюється як "FOO=''", тобто FOOвстановлюється у порожню рядок.
Якщо ви хочете використовувати обидві змінні, то вам потрібно залишити ключове слово heredoc без котирування, так що розширення змінної має місце для локально визначеної змінної, а потім уникнути (із зворотною косою рисою) змінну, яку ви хочете віддалено розширити, тобто :
#!/bin/sh
FOO="foo"
ssh some.remote.host << EOF
BAR="bar"
echo "FOO=$FOO"
echo "BAR=\$BAR"
EOF
У цьому випадку ваша команда ssh (отримана віддаленим сервером) буде такою:
BAR="bar"
echo "FOO=foo"
echo "BAR=$BAR"