En resumen, use:
- palabras clave heredoc no citadas, por ejemplo,
EOF
- dólar regular char para variables externas (es decir, locales ), por ejemplo,
$FOO
- dólar escapado para variables internas (es decir, remotas ), por ejemplo
\$BAR
Si deja la palabra clave heredoc (es decir EOF) sin comillas, el cuerpo heredoc se procesa localmente, de modo que $FOOse expande fooy BARse expande a la cadena vacía. Entonces su sshcomando se convierte en:
BAR="bar"
echo "FOO=foo"
echo "BAR="
Si cita la palabra clave heredoc, se suprime la expansión variable, de modo que su sshcomando se convierte en esto:
BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"
Dado FOOque probablemente no está definido en el entorno de shell remoto, la expresión "FOO=$FOO"se evalúa como "FOO=''", FOOes decir, se establece en la cadena vacía.
Si desea utilizar ambas variables, deberá dejar la palabra clave heredoc sin comillas, para que la expansión de la variable tenga lugar para la variable definida localmente, y luego escapar (con una barra invertida) la variable que desea expandir de forma remota, es decir :
#!/bin/sh
FOO="foo"
ssh some.remote.host << EOF
BAR="bar"
echo "FOO=$FOO"
echo "BAR=\$BAR"
EOF
En este caso, su comando ssh (tal como lo recibe el servidor remoto) será el siguiente:
BAR="bar"
echo "FOO=foo"
echo "BAR=$BAR"