bash - 不带引号的 Heredoc 不扩展参数

标签 bash shell

我正在尝试像这样在 heredoc 中创建和使用变量,

#!bin/bash
sudo su - postgres <<EOF
IP="XYZ"
echo "$IP"
EOF

这不起作用,我得到一个空行作为回显。 但是如果我像这样在 EOF 周围使用引号,

#!bin/bash
sudo su - postgres <<"EOF"
IP="XYZ"
echo "$IP"
EOF

它有效。有人可以解释一下吗?根据我在 man 中读到的内容,行为应该是相反的。

最佳答案

Shell 评估未引用的此处文档并在将其传递给命令(在您的情况下为 sudo)之前执行变量插值。因为 IP 不是父 shell 中定义的变量,所以它被扩展为空字符串。

使用引号可以防止父 shell 进行变量插值,因此 sudo 运行的 shell 会看到并扩展变量。

关于bash - 不带引号的 Heredoc 不扩展参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37561737/

相关文章:

php - 为什么有些字符无法从 Linux/Bash 环境变量中提取到 PHP 中?

bash - +30 别名的 fish shell 列表

json - 如何从可执行 bash 脚本中的 curl 获得正确响应?

linux - 可选的命令行参数 Shell

javascript - 当 docker-compose 退出时运行可执行文件

bash - Cocoa pods 终端 utf-8 编码

linux - Bash while 循环使用包含本地 $variable 的远程 grep

C: 列出当前 shell 的别名(不是子 shell!)

java - 将参数从 Java 程序传递到 shell 脚本

java - 如何使用隐藏终端启动java程序