如何在此处文档中打印“$”

如何在此处文档中打印“$”

如何在 bash 的此处文档中回显“$”?

例如,我想要一个包含远程服务器上内容的文件,例如$ABC=home_dir.

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

但它会被视为一个变量。如何打印文字$

答案1

如果您想编写此处文档,并且不希望扩展该文档的任何内容或解释任何特殊字符,则可以用单引号引用标签,如下所示:

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

但是,您的示例中描述的情况要复杂得多,因为您实际上是通过 ssh 将此内容发送到远程系统,由 sudo 运行,该系统也调用 shell(因此 shell 将扩展内容)以及)。您将需要更多级别的引用才能正确执行此操作,但即使如此,它仍然无法工作,因为 sudo 需要终端(因此它可以要求输入密码)并且您已从标准输入重定向。即使使用在ssh -t这里也无济于事。

我也同意约翰的观点。目前尚不清楚这是否真的是您想要的;请注意,为 shell 变量引用赋值是不合法的,因此,如果您尝试创建的此文件应该是 shell 脚本,则它将无法按照您所描述的那样工作。也许如果你退一步并描述一下你的情况真的想做的事,我们可以帮助更多。

答案2

逃离$

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

我不知道你的用例是什么,但通常你想要home_dir=$ABC而不是$ABC=home_dir.

答案3

最便宜的逃跑方法是

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

答案4

通过将字符串发送到cat远程端的进程,您可以节省一定程度的引用:

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

单引号保护$本地端的 ,而另一端的 shell 永远不会看到该字符串,因为它是由cat(via sudo) 直接读取的,而不是作为另一个 shell 命令的参数。

对于您的代码,您需要额外的转义层来保护$

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

您需要\$向远程主机发送一个文字,以便远程 shell 将文字写入$文件。您还可以通过引用here-doc标记来简化这一点:

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

相关内容