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 funciona como esperaba ( $var
se trata literalmente, no se expande).
Necesito usarlo sudo tee
porque crear el archivo requiere sudo. Haciendo algo como:
sudo cat > /path/to/outfile <<EOT
my text...
EOT
No funciona porque >outfile
abre el archivo en el shell actual, que no está usando sudo.
''
), pero al no citar el delimitador se activa la expansión (como si estuviera dentro""
). Sin embargo, su intuición es correcta en Perl, donde un heredoc con un identificador entre comillas simples se comporta como si estuviera entre comillas simples, uno con un identificador entre comillas dobles como si estuviera entre comillas dobles y otro con un identificador marcado como comillas inversas. ! Ver: perlop: << EOFRespuestas:
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 :
Si cambia su primer ejemplo para usar en
<<EOF
lugar de<< "EOF"
, encontrará que funciona.En su segundo ejemplo, el shell invoca
sudo
solo con el parámetrocat
, y la redirección se aplica a la salida delsudo cat
usuario original. Funcionará si intentas:fuente
(cat > /path/to/outfile) <<EOF
en lugar desudo sh -c ... <<EOF
No use comillas con
<<EOF
:La expansión variable es el comportamiento predeterminado dentro de here-docs. Deshabilita ese comportamiento citando la etiqueta (con comillas simples o dobles).
fuente
Como corolario tardío de las respuestas anteriores aquí, probablemente termines en situaciones en las que quieras que algunas pero no todas las variables se interpolen. Puede resolver eso mediante el uso de barras invertidas para escapar de los signos de dólar y los retrocesos; o puedes poner el texto estático en una variable.
Demostración: https://ideone.com/rMF2XA
Tenga en cuenta que cualquiera de los mecanismos de cotización -
\____HERE
o"____HERE"
o'____HERE'
, deshabilitará toda interpolación de variables y convertirá el documento aquí en un texto literal.Una tarea común es combinar variables locales con un script que debe ser evaluado por un shell, lenguaje de programación u host remoto diferente.
fuente