¿Cómo puedo repetir "$" en un documento aquí en bash?
Por ejemplo, quiero tener un archivo con el contenido en un servidor remoto como $ABC=home_dir
.
$ ssh hostname sudo -s <<EOF
echo "$ABC=home_dir" > file
EOF
Pero se trataría como una variable. ¿Cómo puedo imprimir un literal $
?
scp
?Respuestas:
Si desea escribir un documento aquí y no desea que CUALQUIERA del documento se expanda o se interprete cualquier carácter especial, puede citar la etiqueta con comillas simples, como esta:
Sin embargo, su situación como se describe en su ejemplo es mucho más compleja, porque realmente está enviando este contenido a través de ssh, a un sistema remoto, para que sea ejecutado por sudo, que también invoca un shell (y ese shell expandirá el contenido también). Necesitará más niveles de citas para hacerlo bien, pero incluso con eso no funcionará porque sudo requiere un terminal (por lo que puede solicitar una contraseña) y ha redirigido desde stdin. Incluso el uso
ssh -t
no ayudará aquí.También estoy de acuerdo con Johan. No está claro que esto sea realmente lo que quieres; tenga en cuenta que no es legal asignar un valor a una referencia de variable de shell, por lo que si se supone que este archivo que está intentando crear es un script de shell, no funcionará como lo ha descrito. Tal vez si retrocede un poco y describe lo que realmente quiere hacer, podemos ayudarlo más.
fuente
Escapar del
$
No sé cuál es su caso de uso, pero generalmente desea en
home_dir=$ABC
lugar de$ABC=home_dir
.fuente
=home_dir
en el archivo. Por supuesto, no sé cuál es el caso de uso ...$
que se envíe un literal al shell remoto, pero luego ese shell se expandirá$ABC
antes de hacer eco de la cadenafile
. Para escribir el literal$
en el archivo, necesitará otra barra diagonal inversa (con escape):echo "\\\$ABC=home_dir"
para que el shell remoto recibaecho "\$ABC=home_dir"
.La forma más barata de escapar sería
fuente
Se ahorra un nivel de cita enviando la cadena a un
cat
proceso en el extremo remoto:Las comillas simples protegen el
$
en el extremo local, y la cadena nunca es vista por el shell en el otro porque es leída directamente porcat
(viasudo
), en lugar de ser un argumento para otro comando de shell.Con su código, necesitaría una capa adicional de escape para proteger
$
:Debe enviar un literal
\$
al host remoto, de modo que el shell remoto escriba un literal$
en el archivo. También podría simplificar esto citando el marcador here-doc:fuente