Como imprimir “$” no aqui-documento

36

Como posso ecoar "$" em um aqui-doc no bash?

Por exemplo, eu quero ter um arquivo com o conteúdo no servidor remoto como $ABC=home_dir .

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

Mas isso seria tratado como uma variável. Como posso imprimir um literal $ ?

    
por user21485 19.03.2013 / 09:37

4 respostas

54

Se você quiser escrever um aqui-doc e não quiser que QUALQUER um documento seja expandido ou qualquer caractere especial seja interpretado, você pode citar o rótulo com aspas simples, assim:

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

No entanto, sua situação descrita em seu exemplo é muito mais complexa, porque você está realmente enviando este conteúdo através de ssh, para um sistema remoto, para ser executado pelo sudo que também está invocando um shell (e assim expandir o conteúdo também). Você vai precisar de mais níveis de cotação para acertar, mas mesmo assim, isso não funcionará, porque o sudo requer um terminal (para que ele possa solicitar uma senha) e você foi redirecionado do stdin. Mesmo usando ssh -t não ajudará aqui.

Também concordo com Johan. Não está claro que isso é realmente o que você quer; Observe que não é legal atribuir um valor a uma referência de variável de shell, portanto, se esse arquivo que você está tentando criar é supostamente um script de shell, ele não funcionará como você descreveu. Talvez se você voltar um pouco e descrever o que você realmente quer fazer, podemos ajudar mais.

    
por 19.03.2013 / 13:55
19

Escape do $

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

Eu não sei qual é o seu caso de uso, mas normalmente você quer home_dir=$ABC em vez de $ABC=home_dir .

    
por 19.03.2013 / 09:55
8

A maneira mais barata de escapar seria

$ ssh hostname sudo -s << \EOF
echo "$ABC=home_dir" > file
EOF
    
por 19.03.2013 / 14:56
3

Você economiza um nível de cotação enviando a string para um processo cat no final remoto:

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

As aspas simples protegem o $ no final local, e a string nunca é vista pelo shell no outro, porque é lida diretamente por cat (via sudo ), em vez de ser um argumento para outro comando shell.

Com o seu código, você precisaria de uma camada extra de escape para proteger o $ :

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

Você precisa enviar um literal \$ para o host remoto, para que o shell remoto escreva um literal $ no arquivo. Você também pode simplificar isso citando o marcador here-doc:

$ ssh hostname sudo -s <<\EOF
echo "\$ABC=home_dir" > file
EOF
    
por 24.03.2013 / 04:16