Skip to content

環境変数ファイルを読み込んだ後にコマンドを実行する方法

簡単なものであれば env で実現できる。

Terminal window
env $(cat ~/lib/env) command

ただし、この方法は ~/lib/env の値に空白が含まれたとき困る。IFS= をうまくやれば対応できるが、そこまでやるなら次の方法を使うほうが簡単だろう。

bash には allexport オプションがあり、これを有効にすると全ての変数が環境変数としてエクスポートされる。これを使ってファイルを読む。

Terminal window
set -a
source ~/lib/env
set +a
exec command

標準機能だけで実現できるので、特別な理由がなければこれでいいだろう。

systemd-run でも環境変数を読んでからコマンドを実行できる。この場合はプロセス階層がsystemdユーザーユニットからの派生となるので、~/.bash_profile 等で設定した環境変数は引き継がれない。systemdで環境変数が伝播するしくみも参照するといい。

Terminal window
systemd-run --user --quiet --pty --wait --collect --service-type=exec \
--property EnvironmentFile=~/lib/env command

コマンドのオプションでいえば、デフォルトではコマンドの実行に失敗したときに failed としてユニットが残ってしまうので systemctl —user reset-failed で明示的に消していかなければならない。それでは面倒なので —collect を付けて回収されるようにしている。