passando e configurando variáveis ​​em um heredoc

17

Eu tenho um script que precisa fazer muitas coisas diferentes em várias máquinas remotas. Eu pensei que um heredoc funcionaria para isso, mas não sou capaz de usar uma variável definida em outra parte do script e outra definida 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 imprime apenas o seguinte:

FOO =

BAR = bar

Se, no entanto, citar a linha EOF assim: ssh some.remote.host << "EOF" ela imprime apenas o seguinte:

FOO = foo

BAR =

Alguma dica de como posso usar as duas variáveis ​​dentro do heredoc?

Obrigado.

trubliphone
fonte

Respostas:

27

Em resumo, use:

  • palavras-chave heredoc não citadas, por exemplo, EOF
  • char regular em dólar para variáveis externas ( por exemplo, locais ), por exemplo,$FOO
  • caractere de escape de dólar para variáveis internas ( por exemplo, remotas ), por exemplo\$BAR

Se você deixar a palavra-chave heredoc (ou seja EOF) sem aspas, o corpo do heredoc será processado localmente, para que ele $FOOseja expandido fooe BARexpandido para a cadeia vazia. Então seu sshcomando se torna:

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

Se você citar a palavra-chave heredoc, a expansão da variável será suprimida, para que seu sshcomando se torne este:

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

Como FOOprovavelmente não está definido no ambiente remoto do shell, a expressão "FOO=$FOO"é avaliada como "FOO=''", ou seja, FOOé definida como a sequência vazia.

Se você deseja usar as duas variáveis, precisará 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 você deseja expandir remotamente, ou seja, :

#!/bin/sh

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

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

  BAR="bar"
  echo "FOO=foo"
  echo "BAR=$BAR"
igal
fonte
1
Isso é incrível! Passei séculos tentando descobrir isso. Muito obrigado por esta solução.
trubliphone