Comment puis-je faire écho "$" dans un here-doc in bash?
Par exemple, je veux avoir un fichier avec le contenu sur le serveur distant comme $ABC=home_dir
.
$ ssh hostname sudo -s <<EOF
echo "$ABC=home_dir" > file
EOF
Mais ce serait traité comme une variable. Comment puis-je imprimer un littéral $
?
scp
?Réponses:
Si vous voulez écrire un document ici et que vous ne voulez PAS développer aucun document ou interpréter des caractères spéciaux, vous pouvez citer l'étiquette avec des guillemets simples, comme ceci:
Cependant, votre situation décrite dans votre exemple est beaucoup plus complexe, car vous envoyez ce contenu via ssh à un système distant, qui sera exécuté par sudo, qui appelle également un shell (et ce shell étendra le contenu. ainsi que). Vous aurez besoin de plus de niveaux de cotation pour bien faire les choses, mais même avec cela, cela ne fonctionnera toujours pas car sudo nécessite un terminal (il peut donc demander un mot de passe) et vous avez redirigé de stdin. Même utiliser
ssh -t
ne va pas aider ici.Aussi je suis d'accord avec Johan. Ce n'est pas clair que c'est vraiment ce que vous voulez; notez qu'il est illégal d'attribuer une valeur à une référence de variable shell. Par conséquent, si le fichier que vous essayez de créer est censé être un script shell, il ne fonctionnera pas comme vous l'avez décrit. Peut-être que si vous reculez un peu et décrivez ce que vous voulez vraiment faire, nous pouvons vous aider davantage.
la source
Échapper à la
$
Je ne sais pas quel est votre cas d'utilisation, mais vous souhaitez généralement le
home_dir=$ABC
remplacer$ABC=home_dir
.la source
=home_dir
dans le fichier? Bien sûr, je ne sais pas quel est le cas d'utilisation ...$
envoi d' un littéral au shell distant, mais celui- ci se développera$ABC
avant de lancer l'écho de la chaînefile
. Pour écrire le littéral$
dans le fichier, vous aurez besoin d'une autre barre oblique inverse:,echo "\\\$ABC=home_dir"
afin que le shell distant puisse recevoirecho "\$ABC=home_dir"
.Le moyen le plus économique de s’échapper serait
la source
Vous vous épargnez un niveau de citation en envoyant la chaîne à un
cat
processus distant:Les guillemets simples protègent l'
$
extrémité locale et la chaîne n'est jamais vue par le shell car elle est lue directement parcat
(viasudo
) et non comme un argument pour une autre commande shell.Avec votre code, vous auriez besoin d’une couche supplémentaire d’échappement pour protéger le
$
:Vous devez envoyer un littéral
\$
à l'hôte distant afin que le shell distant en écrive un$
dans le fichier. Vous pouvez également simplifier ceci en citant le marqueur here-doc:la source