Aqui documenta sem interpretar seqüências de escape, mas com interpolação

1

Existe alguma maneira de catar um arquivo sem interpretar a contrabarra dupla como uma seqüência de escape?

Neste exemplo, um arquivo tex é criado:

cat <<EOF > file.tex
\documentclass[varwidth=true,border=5pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}

\begin{document}
$1
\end{document}
EOF

Como posso escrever isso para que a barra invertida não precise ser escrita duas vezes, mas $1 ainda está expandido com seu valor normal (que pode conter barras invertidas também)?

    
por nightcod3r 08.07.2017 / 00:56

2 respostas

1

Não, você está sem sorte. O manual indica:

and \ must be used to quote the characters \, $, and '

Existe uma solução alternativa, use vários aqui-docs:

cat <<\EOF > file.tex
\documentclass[varwidth=true,border=5pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}

\begin{document}
EOF
cat <<EOF >> file.tex
$1
EOF
cat <<\EOF >> file.tex
\end{document}
EOF

Ou melhor, uma vez que uma variável contenha uma folga, ela não é alterada na expansão:

doc1='\documentclass[varwidth=true,border=5pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}

\begin{document}
'
doc2="$1"
doc3='\end{document}
'
cat <<EOF > file.tex
$doc1
$doc2
$doc3
EOF

Que é uma maneira complicada de escrever:

doc='\documentclass[varwidth=true,border=5pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}

\begin{document}
'"$1"'
\end{document}
'
printf '%s' "$doc" > file.tex

Isso também funciona com alguns outros exemplos:

$ doc='\[\begin{bmatrix} t_{11} & t_{12} & t_{13} & t_{14} \ t_{21} & t_{22} & t_{23} & t_{24} \ t_{31} & t_{32} & t_{33} & t_{34} \end{bmatrix}\]'

$ printf '%s\n' "$doc"
\[\begin{bmatrix} t_{11} & t_{12} & t_{13} & t_{14} \ t_{21} & t_{22} & t_{23} & t_{24} \ t_{31} & t_{32} & t_{33} & t_{34} \end{bmatrix}\]'

E também, apenas para mostrar que as variáveis são expandidas apenas uma vez :

$ cat <<EOF
$doc
EOF
\[\begin{bmatrix} t_{11} & t_{12} & t_{13} & t_{14} \ t_{21} & t_{22} & t_{23} & t_{24} \ t_{31} & t_{32} & t_{33} & t_{34} \end{bmatrix}\]
    
por 08.07.2017 / 04:10
-1

Use cat << \EOF > file.tex . Não haverá expansões de parâmetros ou escapes analisados no heredoc.

$ cat t.sh
#!/usr/local/bin/bash
cat << \EOF
testing
\testing
\testing
EOF
$ ./t.sh
testing
\testing
\testing
    
por 08.07.2017 / 01:02