passando e definindo variáveis em um heredoc

5

Eu tenho um script que tem que fazer muitas coisas diferentes em muitas máquinas remotas diferentes. Eu pensei que um heredoc iria trabalhar para isso, mas eu não sou capaz de usar uma variável definida em outro lugar no script e um definido no heredoc.

Aqui está um código:

#!/bin/sh

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

Isso só imprime o seguinte:

FOO=

BAR=bar

Se, no entanto, eu citar a linha EOF assim: %código% então só imprime o seguinte:

FOO=foo

BAR=

Alguma dica de como eu posso usar ambas variáveis dentro do heredoc?

Obrigado.

    
por trubliphone 17.11.2017 / 14:02

1 resposta

9

Se você deixar a palavra-chave heredoc (ou seja, EOF ) sem aspas, o corpo heredoc será processado localmente, de modo que $FOO seja expandido para foo e BAR seja expandido para a cadeia vazia. Então seu comando ssh se torna:

BAR="bar"
echo "FOO=foo"
echo "BAR="

Se você citar a palavra-chave heredoc, a expansão de variáveis será suprimida, de modo que o comando ssh se torne o seguinte:

BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"

Como FOO provavelmente não está definido no ambiente de shell remoto, a expressão "FOO=$FOO" é avaliada como "FOO=''" , ou seja, FOO é definida como a string vazia.

Se você quiser usar as duas variáveis, será necessário deixar a palavra-chave heredoc sem aspas, para que a expansão da variável ocorra para a variável definida localmente e, em seguida, escape (com uma barra invertida) a variável que deseja expandir remotamente, ou seja:

#!/bin/sh

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

Neste caso, seu comando ssh (como recebido pelo servidor remoto) será o seguinte:

  BAR="bar"
  echo "FOO=foo"
  echo "BAR=$BAR"
    
por 17.11.2017 / 14:34