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

use*_*485 49 shell bash quoting

如何在 bash 的 here-doc 中回显“$”?

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

$ ssh hostname sudo -s <<EOF
echo "$ABC=home_dir" > file
EOF
Run Code Online (Sandbox Code Playgroud)

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

Mad*_*ist 75

如果您想编写一个 here-doc 并且您不希望扩展任何文档或解释任何特殊字符,您可以用单引号引用标签,如下所示:

$ cat >file <<'EOF'
echo "$ABC=home_dir"
EOF
Run Code Online (Sandbox Code Playgroud)

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

我也同意约翰。目前还不清楚这是否真的是你想要的;请注意,将值分配给 shell 变量引用是不合法的,因此如果您尝试创建的此文件应该是 shell 脚本,则它不会像您描述的那样工作。也许如果您稍微备份一下并描述您真正想做的事情,我们可以提供更多帮助。


les*_*ana 22

逃离 $

$ ssh hostname sudo -s <<EOF
echo "\$ABC=home_dir" > file
EOF
Run Code Online (Sandbox Code Playgroud)

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

  • 这将导致一个文本`$` 被发送到远程shell,但是*那个* shell 将在将字符串回显到`file` 之前扩展`$ABC`。要将文字 `$` 写入文件,您需要另一个(转义)反斜杠:`echo "\\\$ABC=home_dir"`,以便远程 shell 接收 `echo "\$ABC=home_dir"` . (3认同)
  • 这个解决方案会起作用,但这真的是 OP 想要的吗?它似乎生成了一个 shell 脚本,该脚本在执行时将在“文件”中存储一个字符串,该字符串将取消对分配左侧的 ABC 的引用,并可能最终将 `=home_dir` 存储到文件中?当然我不知道用例是什么...... (2认同)

Ber*_*ard 9

最便宜的逃跑方式是

$ ssh hostname sudo -s << \EOF
echo "$ABC=home_dir" > file
EOF
Run Code Online (Sandbox Code Playgroud)