Bash

通過標準輸入向 bash 提供命令時無法使用變數

  • February 21, 2021

我需要使用 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=

我錯過了什麼?為什麼我不能使用標準輸入中的變數?

(版本:GNU bash 5.1.4,破折號 0.5.11+git20200708+dd9ef66-5)

除非您引用或轉義以下部分的某些部分,否則 here-document 的正文將受到參數擴展、命令替換和算術擴展的影響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- 請參見

引用自:https://unix.stackexchange.com/questions/635703