Como posso ecoar "$" em um documento aqui 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 $
?
scp
?Respostas:
Se você deseja escrever um documento aqui e não deseja que QUALQUER documento seja expandido ou que qualquer caractere especial seja interpretado, você pode citar o rótulo com aspas simples, como este:
No entanto, sua situação, conforme descrito no seu exemplo, é muito mais complexa, porque você está realmente enviando esse conteúdo através do ssh, para um sistema remoto, para ser executado pelo sudo, que também está chamando um shell (e, assim, o shell expandirá o conteúdo também). Você precisará de mais níveis de cotação para fazer isso direito, mas mesmo assim ainda não funcionará porque o sudo requer um terminal (para que possa solicitar uma senha) e você o redirecionou do stdin. Mesmo usando
ssh -t
não vai ajudar aqui.Também concordo com Johan. Não está claro que isso é realmente o que você deseja; observe que não é legal atribuir um valor a uma referência de variável do shell; portanto, se esse arquivo que você está tentando criar for um script de shell, ele não funcionará como você o descreveu. Talvez se você voltar um pouco e descrever o que realmente deseja fazer, possamos ajudar mais.
fonte
Escape the
$
Não sei qual é o seu caso de uso, mas geralmente você deseja, em
home_dir=$ABC
vez de$ABC=home_dir
.fonte
=home_dir
no arquivo? Claro que eu não sei o que o caso de uso é ...$
seja enviado ao shell remoto, mas esse shell será expandido$ABC
antes de ecoar a string parafile
. Para gravar o literal$
no arquivo, você precisará de outra barra invertida (com escape):,echo "\\\$ABC=home_dir"
para que o shell remoto recebaecho "\$ABC=home_dir"
.A maneira mais barata de escapar seria
fonte
Você economiza um nível de cotação enviando a string para um
cat
processo no final remoto:As aspas simples protegem a
$
extremidade local e a string nunca é vista pelo shell do outro porque é lida diretamente porcat
(viasudo
), em vez de ser um argumento para outro comando do shell.Com seu código, você precisaria de uma camada extra de escape para proteger
$
:Você precisa enviar um literal
\$
para o host remoto, para que o shell remoto grave um literal$
no arquivo. Você também pode simplificar isso citando o marcador aqui-doc:fonte