bash variables sh heredoc

Usar variables dentro de un bash heredoc



(2)

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 <<EOF 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" <<EOT my text... EOT


No utilice comillas con <<EOF :

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

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