passando e impostando variabili in una eredità


18

Ho uno script che deve fare molte cose diverse su molte macchine remote diverse. Pensavo che un heredoc avrebbe funzionato per questo, ma non sono in grado di usare una variabile definita altrove nello script e una definita nell'ereded.

Ecco un po 'di codice:

#!/bin/sh

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

Questo stampa solo quanto segue:

FOO =

BAR = bar

Se, tuttavia, cito la riga EOF in questo modo: ssh some.remote.host << "EOF" quindi stampa solo quanto segue:

FOO = foo

Bar =

Qualche suggerimento su come posso usare entrambe le variabili all'interno dell'ereditarietà?

Grazie.

Risposte:


27

In breve, utilizzare:

  • parole chiave ereditate non quotate, ad es. EOF
  • carattere regolare del dollaro per variabili esterne (cioè locali ), ad es.$FOO
  • carattere dollaro sfuggito per variabili interne (cioè remote ), ad es\$BAR

Se lasci la parola chiave heredoc (cioè EOF) non quotata, il corpo ereditario viene elaborato localmente, quindi $FOOviene espanso fooe BARespanso nella stringa vuota. Quindi il tuo sshcomando diventa:

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

Se citi la parola chiave heredoc, l'espansione della variabile viene soppressa, in modo che il tuo sshcomando diventi questo invece:

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

Poiché FOOprobabilmente non è definito nell'ambiente di shell remoto, l'espressione "FOO=$FOO"viene valutata come "FOO=''", ovvero FOOè impostata su una stringa vuota.

Se si desidera utilizzare entrambe le variabili, è necessario lasciare la parola chiave heredoc senza virgolette, in modo che l'espansione della variabile avvenga per la variabile definita localmente e quindi sfuggire (con una barra rovesciata) alla variabile che si desidera espandere a distanza, ovvero :

#!/bin/sh

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

In questo caso il comando ssh (come ricevuto dal server remoto) sarà il seguente:

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

1
Questo è impressionante! Ho passato secoli cercando di capirlo. Grazie mille per questa soluzione.
trubliphone
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.