我需要使用 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
- 请参阅