Você deve citar o marcador End-Of-File, ou seja, a expansão da variável (ou melhor, tudo começando com $
, irá obter o contexto atual.
Compare:
hi=here
cat >file.sh <<EOF
#!/bin/sh
hi=there
echo $hi
EOF
sh file.sh
(saídas here
)
hi=here
cat >file.sh <<\EOF
#!/bin/sh
hi=there
echo $hi
EOF
sh file.sh
saídas de there
hi=here
cat >file.sh <<'EOF'
#!/bin/sh
hi=there
echo $hi
EOF
sh file.sh
saídas de there
.
Como alternativa, você pode citar o $
:
hi=here
cat >file.sh <<EOF
#!/bin/sh
hi=there
echo \$hi
EOF
sh file.sh
(saídas there
)
Este comportamento inicialmente surpreendente é muito útil quando existe a necessidade de gerar scripts ligeiramente diferentes para várias finalidades.