如何在 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