コマンドラインで環境変数ファイルをどのように設定しますか?

コマンドラインで環境変数ファイルをどのように設定しますか?

シェルスクリプトの起動時にロードする必要がある一連の環境変数を含む.env.localファイルがあります。コマンドラインでこのファイルを指定する方法はありますか?

.env.local

ONEDRIVE_TENANT_ID=...
ONEDRIVE_CLIENT_ID=...
ONEDRIVE_CLIENT_SECRET=...

シェルスクリプト:script.sh

#!/usr/bin/env bash
TENANT_ID=${ONEDRIVE_TENANT_ID}
CLIENT_ID=${ONEDRIVE_CLIENT_ID}
CLIENT_SECRET=${ONEDRIVE_CLIENT_SECRET}
REDIRECT_URI=${ONEDRIVE_REDIRECT_URI}
curl REDIRECT_URI ...

試してみましたが、source .env.local; sh script.sh期待どおりに動作しません!
Ps、スクリプトはさまざまな環境で実行されるため、スクリプトにソースコードを追加することはできません。したがって、.env.local の絶対パスは環境によって異なります。

答え1

BASH_ENV変数の割り当てにより、ドットスクリプトを指すように設定できます。これにより、スクリプトを実行する前にシェル変数が自動的に取得され、スクリプトでシェル変数を使用できるようになります。

BASH_ENV=path/to/.env.local ./script.sh

スクリプトscript.shの場合は、ドットスクリプトの変数(および関数など)にアクセスできます。bash.env.local

bashマニュアルから:

BASH_ENV
シェルスクリプトの実行時にこのパラメータを設定すると、そのbash値はシェルを初期化したコマンドを含むファイル名に解決されます。名前。検索結果ファイル名には使用されません。~/.bashrcBASH_ENVPATH


あなたのスクリプトはいいえコマンドラインでbash他のスクリプト言語への明示的なインタプリタを使用している場合(たとえば、質問で行ったように)によって実行されます。sh

答え2

source .env.local; sh script.sh.env.localではなく親シェルのコンテキストで実行されますscript.sh。そこに設定された汎用シェル変数は子プロセスには表示されません。あなたはそれらを明確に述べる必要がありますexport

.env.local次のようにしてください:

export ONEDRIVE_TENANT_ID=...
export ONEDRIVE_CLIENT_ID=...
export ONEDRIVE_CLIENT_SECRET=...

答え3

スクリプト内で呼び出してみてくださいsource "file.env.local"(編集:変数/配列を呼び出す前に)。

それともこれが役に立つかもしれません https://stackoverflow.com/questions/19331497/set-environment-variables-from-file-of-key-value-pairs

関連情報