Eu tenho um script que simplifiquei aqui:
#!/bin/bash
# test.sh
set -u
### test-script ###
cat <<SCRIPT > ~/test-file-output
#!/bin/bash
set -e
usage() {
cat <<EOF
Does a thing
EOF
}
for opt in "$@"; do
case $opt in
-h|--help)
usage
exit 0
;;
*)
echo "Invalid option: $opt" >&2
usage
exit 1
;;
esac
done
SCRIPT
chmod +x ~/test-file-output
e porque o script pai tem set -u
ele está pegando o opt
var no script filho no heredoc; o script filho define opt
o valor de $@
.
Existe uma maneira de ignorar todas as vars e textos no heredoc, pois não faz parte do próprio script pai? Eu pensei que iria tratar o heredoc como uma string gigante e não analisá-lo de acordo com a sintaxe do script.
Um heredoc é uma string gigante, mas se a string do terminador (
SCRIPT
em seu<< SCRIPT
) não estiver entre aspas, ela age como uma string com aspas duplas , então quaisquer variáveis são expandidas. Se qualquer parte do terminador estiver entre aspas no redirecionamento (por exemplo<< "SCRIPT"
, ), ele agirá como uma string com aspas simples , portanto, nenhuma variável será expandida.Considere este roteiro:
O primeiro
EOF
não é citado, então$var
se expande. A segunda é, então a string que vaicat
contém um literal$var
.