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 delimiterNo 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).