コマンド置換の出力をループし、ループ本体内で別のコマンド置換を実行しようとする bash スクリプトを作成しています。コードは次のとおりです。
#!/usr/bin/bash
IFS=$'\n'
for i in $( xmllint --xpath "string(/*[local-name()='Project'])" gsGDAL/gsGDAL.vcxproj.user )
do
IFS=' ' #attempted with and without this line
"$( awk -F= '{printf("export %s=\"%s\"", $1, $2)}' <(echo $i) )"
IFS=$'\n' #attempted with and without this line
done
IFS を newline に設定して、ループがスペースで区切られた各単語を反復するのではなく、xmllint コマンドの出力の各行を反復するようにします。ただし、これにより、ループ内のコマンド置換が失敗します。デバッグの結果、問題の本質は次のとおりであるという結論に達しました。
#!/usr/bin/bash
IFS=$'\n'
$(echo export TEST="test")
エラーが発生します:
./x.sh: line 6: export TEST=test: command not found
ループ内で IFS をリセットすることにより、最初のコード例で修正を試みたことがわかります。それはうまくいきませんでした。
スクリプトの別のイディオムを使用して問題を解決できることに気付きました。
たとえば、1 つの可能性を示すために、個々の行で awk を実行する代わりに、xmllint コマンドを awk に置き換えるプロセス。その趣旨のコメントは大歓迎ですが、以下に関連する回答を提出してください。
- IFS を改行に設定すると、コマンド置換で生成されたエクスポートが台無しになるのはなぜですか?
- ループ内で IFS をリセットしても問題が解決しないのはなぜですか?
更新: Barmar との議論によると、IFS はコマンド/変数展開後の単語分割に使用されます。