通过 stdin 向 bash 提供命令时无法使用变量

通过 stdin 向 bash 提供命令时无法使用变量

我需要使用 C popen 调用(调用sh -c '<command>')运行一个小型 shell 脚本。我无法让我的脚本运行。我将问题隔离到这个片段:

#!/bin/bash

sh -c 'bash -xev -s << EOF
a=1
echo "a=$a"
EOF'

哪个输出

a=1
+ a=1
echo "a="
+ echo a=
a=

我缺少什么?为什么我不能使用 stdin 中的变量?

(版本:GNU bash 5.1.4、dash 0.5.11+git20200708+dd9ef66-5)

答案1

EOF除非您引用或转义以下部分,否则此处文档的正文将受到参数扩展、命令替换和算术扩展的影响:

$ sh -c 'bash -xev -s << \EOF
a=1
echo "a=$a"
EOF'
a=1
+ a=1
echo "a=$a"
+ echo a=1
a=1

您还可以使用常规引号"EOF"'EOF'.

对于更复杂的情况,例如您希望外壳扩展一些但不是全部变量,您可以保留EOF不带引号并转义特定变量,例如\$a- 请参阅

相关内容