Usando variables ​​dentro de um bash heredoc

Estou tentando interpolar variables ​​dentro de uma bash heredoc:

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.

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 :

O formato dos documentos aqui é:

  < <[-]word here-document delimiter 

Nenhuma expansão de parâmetro, substituição de comando, expansão aritmética ou expansão de nome de caminho é executada na palavra . Se houver caracteres na palavra , o delimitador é o resultado da remoção de cotações na palavra e as linhas no documento aqui não são expandidas. Se a palavra não for citada, todas as linhas do documento here serão submetidas à expansão de parâmetros, substituição de comando e expansão aritmética. [...]

Se você alterar seu primeiro exemplo para usar < vez de < < "EOF" verá que ele funciona.

Em seu segundo exemplo, o shell invoca sudo apenas com o parâmetro cat , e o redirecionamento se aplica à saída do sudo cat como o usuário original. Isso funcionará se você tentar:

 sudo sh -c "cat > /path/to/outfile" <  

Não use aspas com < :

 var=$1 sudo tee "/path/to/outfile" > /dev/null <  

A expansão de variables ​​é o comportamento padrão dentro do here-docs. Você desativa esse comportamento citando o label (com aspas simples ou duplas).