À l'aide de variables à l'intérieur d'un bash heredoc
Je suis en train d'interpolation de variables à l'intérieur d'un bash heredoc:
var=$1
sudo tee "/path/to/outfile" > /dev/null << "EOF"
Some text that contains my $var
EOF
Ce qui ne fonctionne pas comme je l'avais prévu ($var
est traitée littéralement, et non développé).
J'ai besoin d'utiliser sudo tee
en raison de la création du fichier de sudo. Faire quelque chose comme:
sudo cat > /path/to/outfile <<EOT
my text...
EOT
Ne fonctionne pas, parce que >outfile
ouvre le fichier dans le shell courant, ce qui n'est pas l'utilisation de sudo.
- C'est une confusion compréhensible! Comme indiqué ci-dessous, en citant une partie de la délimiteur s'éteint expansion dans le heredoc (comme si c'était dans
''
), mais ne cite pas le délimiteur tourne expansion (comme si c'était dans""
). Cependant, votre intuition est correcte en Perl, où un heredoc avec un seul identificateur entre guillemets se comporte comme si elle était entre guillemets simples, une avec un lit double-identificateur entre guillemets, comme si de guillemets doubles et une avec en arrière-cochée identifiant comme si dans backticks! Voir: perlop: <<EOF
Vous devez vous connecter pour publier un commentaire.
En réponse à votre première question, il n'y a pas de paramètre de substitution parce que vous avez mis le délimiteur entre guillemets - le bash manuel dit:
Si vous modifiez votre premier exemple d'utilisation
<<EOF
au lieu de<< "EOF"
vous verrez que cela fonctionne.Dans votre deuxième exemple, le shell appelle
sudo
uniquement avec le paramètrecat
, et la redirection s'applique à la sortie desudo cat
que l'utilisateur d'origine. Cela fonctionnera si vous essayez:(cat > /path/to/outfile) <<EOF
en place de lasudo sh -c ... <<EOF
Ne pas utiliser des guillemets avec
<<EOF
:L'expansion des variables est le comportement par défaut à l'intérieur de l'ici-docs. Vous désactiver ce comportement en citant l'étiquette (avec des guillemets simples ou doubles).
Comme une fin corolloary au plus tôt des réponses ici, vous avez probablement jusqu'à la fin dans les situations où vous voulez certains mais pas tous variables interpolées. Vous pouvez résoudre que par l'aide de barres obliques inverses pour échapper à dollar des signes et des backticks; ou vous pouvez mettre le texte statique dans une variable.
Démo: https://ideone.com/rMF2XA
Noter que les citant les mécanismes de
\____HERE
ou"____HERE"
ou'____HERE'
-- permet de désactiver toutes interpolation de variable, et tourner à l'ici-document dans un morceau de texte littéral.Une tâche commune est de combiner des variables locales avec un script qui doit être évaluée par un autre shell, langage de programmation, ou de l'hôte distant.