Коротше кажучи, використовуйте:
- без котирування ключових слів 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"