Usar variables dentro de un bash heredoc

Estoy tratando de interpolar variables dentro de un bash heredoc:

var=$1 sudo tee "/path/to/outfile" > /dev/null << "EOF" Some text that contains my $var EOF 

Esto no está funcionando como esperaba ($ var se trata literalmente, no expandido).

Necesito usar sudo tee porque crear el archivo requiere sudo. Haciendo algo como:

 sudo cat > /path/to/outfile <<EOT my text... EOT 

No funciona, porque> archivo de salida abre el archivo en el shell actual, que no usa sudo.

En respuesta a su primera pregunta, no hay sustitución de parámetros porque ha puesto el delimitador entre comillas: el manual de bash dice :

El formato de los documentos aquí es:

  <<[-]word here-document delimiter 

No se realiza expansión de parámetros, sustitución de comandos, expansión aritmética o expansión de nombre de ruta en palabra . Si se citan los caracteres de la palabra , el delimitador es el resultado de la eliminación de la cita en la palabra, y las líneas en el documento aquí no se expanden. Si la palabra no está citada, todas las líneas del documento aquí están sujetas a expansión de parámetros, sustitución de comandos y expansión aritmética. [...]

Si cambia su primer ejemplo para usar < lugar de << "EOF" , encontrará que funciona.

En su segundo ejemplo, el shell invoca sudo solo con el parámetro cat , y la redirección se aplica a la salida de sudo cat como el usuario original. Funcionará si intentas:

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

No utilice comillas con < :

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

La expansión variable es el comportamiento predeterminado dentro de here-docs. Deshabilita ese comportamiento al citar la etiqueta (con comillas simples o dobles).