Desde que as barras invertidas do terminal não estejam presentes, as novas linhas de um heredoc são preservadas após capturar a saída de um heredoc em uma variável:
var=$(cat <<-EOF
a
b
c
EOF
)
echo "$var"
a
b
c
No entanto, as novas linhas são perdidas ao tentar armazenar novas linhas de barra invertida:
var=$(cat <<-EOF
a \\
b \\
c
EOF
)
echo "$var"
a \b \c
Adicionar barras invertidas adicionais para escape adicional não ajuda.
Claro, quando não executado em um subshell, um heredoc pode ser usado para gerar linhas que terminam em backslash-newline:
$ cat <<-EOF
a \\
b \\
c
EOF
a \
b \
c
Para contornar esse problema, pode-se adicionar um delimitador de nova linha para gerar a saída desejada por uma transformação da variável:
var=$(cat <<-EOF
a \\@
b \\@
c
EOF
)
tr -d '@' <<<"$var"
a \
b \
c
Existe uma maneira mais direta de preservar as novas linhas de barra invertida de heredocs executados em subshells?
Gostaria de saber se isso é um bug no Bash (ou se o comportamento de backslash-newlines é apenas indefinido). Todos os outros shells que tentei mostram um comportamento diferente do Bash:
resultado:
vs.
Você pode colocar o código dentro da substituição do comando em uma função, que pode ajudar a solucionar quaisquer problemas com o analisador, por exemplo:
Não há uma maneira direta de fazer com que o caractere de nova linha seja expandido à força dentro de um here-doc. Mas você pode usar uma variável que contém um caractere de nova linha codificado usando a sequência de escape ANSI (
$'\n'
) e fazer a expansão da variável acontecer dentro do heredoc.Observe que esta forma de expansão hereodoc precisaria que seu delimitador
'EOF'
não fosse citado, ou seja, algo como abaixo,e use a
$nl
variável como um espaço reservado para o caractere de nova linhaque agora emite corretamente