Ответ 1
Я думаю, что это то, что вы хотите:
A=3;
ssh [email protected] "B=3; echo $A; echo \$B;"
Когда вы используете двойные кавычки:
Ваша оболочка автоматически расширяет переменные с префиксом $
, поэтому в первом примере, когда он видит
ssh [email protected] "B=3; echo $A; echo $B;"
bash расширяет его до:
ssh [email protected] "B=3; echo 3; echo ;"
и , затем передает [email protected] "B=3; echo 3; echo ;"
в качестве аргумента ssh
. Это связано с тем, что вы определили A
с A=3
, но вы никогда не определяли B
, поэтому $B
разрешает локальную пустую строку.
При использовании одиночных кавычек:
Все, заключенные в одиночные кавычки, интерпретируются как строковые литералы, поэтому, когда вы делаете:
ssh [email protected] 'B=3; echo $A; echo $B;'
инструкции B=3; echo $A; echo $B;
будут запускаться после входа на удаленный сервер. Вы определили B
в удаленной оболочке, но вы никогда не говорили ей, что A
, поэтому $A
будет разрешено к пустой строке.
Поэтому, когда вы используете \$
, как в решении:
\$
означает интерпретировать символ $
буквально, поэтому мы отправляем буквально echo $B
в качестве одной из команд для удаленного выполнения, вместо того, чтобы сначала bash развернуть $B
локально. То, что мы заканчиваем тем, что говорим ssh
делать, эквивалентно этому:
ssh [email protected] 'B=3; echo 3; echo $B;'