Estou tentando interpolar variáveis dentro de um heredoc bash:
var=$1
sudo tee "/path/to/outfile" > /dev/null << "EOF"
Some text that contains my $var
EOF
Isso não está funcionando como eu esperaria ( $var
é tratado literalmente, não expandido).
Eu preciso usar sudo tee
porque a criação do arquivo requer sudo. Fazendo algo como:
sudo cat > /path/to/outfile <<EOT
my text...
EOT
Não funciona, porque >outfile
abre o arquivo no shell atual, que não está usando o sudo.
''
), mas não citar o delimitador ativa a expansão (como se estivesse dentro""
). No entanto, sua intuição está correta no Perl, onde um heredoc com identificador de aspas simples se comporta como se estivesse entre aspas simples, um com um identificador de aspas duplas como se estivesse entre aspas duplas e outro com identificador de retorno marcado como se estivesse em backticks ! Veja: perlop: << EOFRespostas:
Em resposta à sua primeira pergunta, não há substituição de parâmetro porque você colocou o delimitador entre aspas - o manual do bash diz :
Se você alterar seu primeiro exemplo para usar em
<<EOF
vez de,<< "EOF"
verá que funciona.No seu segundo exemplo, o shell chama
sudo
apenas com o parâmetrocat
e o redirecionamento se aplica à saídasudo cat
como o usuário original. Funcionará se você tentar:fonte
(cat > /path/to/outfile) <<EOF
no lugar desudo sh -c ... <<EOF
Não use aspas com
<<EOF
:Expansão variável é o comportamento padrão nos documentos aqui. Você desativa esse comportamento citando o rótulo (com aspas simples ou duplas).
fonte
Como corolário tardio das respostas anteriores aqui, você provavelmente acaba em situações em que deseja que algumas, mas nem todas as variáveis sejam interpoladas. Você pode resolver isso usando barras invertidas para escapar de cifrões e reticulares; ou você pode colocar o texto estático em uma variável.
Demonstração: https://ideone.com/rMF2XA
Observe que qualquer um dos mecanismos de citação -
\____HERE
ou"____HERE"
ou'____HERE'
- desabilitará toda a interpolação de variáveis e transformará o documento aqui em um pedaço de texto literal.Uma tarefa comum é combinar variáveis locais com scripts, que devem ser avaliados por um shell, linguagem de programação ou host remoto diferente.
fonte