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