pasar y establecer variables en un heredoc

18

Tengo un script que tiene que hacer muchas cosas diferentes en muchas máquinas remotas diferentes. Pensé que un heredoc funcionaría para esto, pero no puedo usar una variable definida en otra parte del script y una definida en el heredoc.

Aquí hay un código:

#!/bin/sh

FOO="foo"
ssh some.remote.host << EOF
  BAR="bar"
  echo "FOO=$FOO"
  echo "BAR=$BAR"
EOF

Esto solo imprime lo siguiente:

FOO =

BAR = barra

Sin embargo, si cito la línea EOF de esta manera: ssh some.remote.host << "EOF" solo imprime lo siguiente:

FOO = foo

BAR =

¿Alguna pista sobre cómo puedo usar ambas variables dentro del heredoc?

Gracias.

trubliphone
fuente

Respuestas:

27

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"
igal
fuente
1
Eso es asombroso! He pasado años tratando de resolver esto. Muchas gracias por esta solución.
trubliphone