envを使用してスペースを含む環境変数を設定する

envを使用してスペースを含む環境変数を設定する

子プロセスの環境変数を設定するために使用しようとしていますenv(他のソース(ファイルなど)から読み取る)。デフォルトでは、次のことを試しています。

env VALUE=thisisatest ./somescript.sh

たとえば、次のような場合somescript.shです。

echo $VALUE

これはthisisatest期待どおりに印刷されます。しかし、ファイルから変数をロードしたいと思います。私はこのポイントに達しました:

env $(cat .vars | xargs -d '\n') ./somescript.sh

しかし、変数にスペースが含まれていると問題が発生します(引用符が期待どおりに機能しません)。。たとえば、

env $(echo 'VALUE="this is a test"' | xargs -d '\n') ./somescript.sh

エラーを報告します

env: is: No such file or directory

そして試してみてください:

env $(echo 'VALUE="thisisatest"' | xargs -d '\n') ./somescript.sh

私に予期せぬことを与えるでしょう:

"thisisatest"

env VALUE="thisisatest" ./somescript.sh私は実行が引用符なしで印刷するので、これはうまくいくと思います。

エラーで、私は何らかの理由でenvが引用符が次の値が文字列でなければならないことを意味しないことを理解していないことを理解しています。しかし、引用符を正しく解釈する方法でこれらの変数を挿入する方法はわかりません。

誰もが私がこれを達成する方法についてのアドバイスを提供できますか?

ありがとうございます!

ベストアンサー1

コマンドの置換には二重引用符を使用する必要があります。それ以外の場合、シェルはコマンド置換の結果に基づいてフィールド分割を実行します。

$ env "$(echo 'VALUE="this is a test"')" ./somescript.sh
"this is a test"

ファイルから読み取るには、envシェルにフィールド分割を実行させる必要がありますが、IFSコマンドが空白のため中断されないように改行文字にのみ設定する必要があります。

$ IFS='
'
$ env $(cat .vars) ./somescript.sh

ファイルから読み取るには、ソース(別名)を使用することをお勧めします。指す)ファイルの場所somescript.sh

#!/bin/bash

. .vars
: The rest of script go here

おすすめ記事