Comment imprimer “$” dans le document ici


42

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 $?


2
vous pouvez utiliser des guillemets simples
Rahul Patil

2
C'est beaucoup d'indirection en cours. Êtes-vous sûr de ne pas pouvoir créer le fichier sur l'hôte local et ensuite scp?
l0b0

Réponses:


65

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:

$ cat >file <<'EOF'
echo "$ABC=home_dir"
EOF

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


C’est la meilleure réponse car elle peut prendre en charge de très longs documents ICI. C'est (surtout) idiot-proof.
Felipe Alvarez

22

Échapper à la $

$ ssh hostname sudo -s <<EOF
echo "\$ABC=home_dir" > file
EOF

Je ne sais pas quel est votre cas d'utilisation, mais vous souhaitez généralement le home_dir=$ABCremplacer $ABC=home_dir.


2
Cette solution fonctionnera, mais est-ce vraiment ce que le PO veut? Il semble générer un script shell qui, une fois exécuté, stockera dans "fichier" une chaîne qui déréférencera ABC pour le côté gauche de la signature et finira probablement par le stocker =home_dirdans le fichier? Bien sûr, je ne sais pas quel est le cas d'utilisation ...
Johan

2
Cela entraînera l' $envoi d' un littéral au shell distant, mais celui- ci se développera $ABCavant de lancer l'écho de la chaîne file. 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 recevoir echo "\$ABC=home_dir".
Chepner

9

Le moyen le plus économique de s’échapper serait

$ ssh hostname sudo -s << \EOF
echo "$ABC=home_dir" > file
EOF

4

Vous vous épargnez un niveau de citation en envoyant la chaîne à un catprocessus distant:

echo 'echo $ABC=home_dir' | ssh hostname sudo -s "cat > file"

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 par cat(via sudo) 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 $:

$ ssh hostname sudo -s <<EOF
echo "\\\$ABC=home_dir" > file
EOF

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:

$ ssh hostname sudo -s <<\EOF
echo "\$ABC=home_dir" > file
EOF
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.