2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

他シェルへの変数が共有されない問題について

Last updated at Posted at 2020-03-10

概要

CI/CD対応でシェルスクリプトを書くことは必然ですよね。
あまり意識していなかった変数のスコープでハマったことと対策についてのまてめです。

問題

タイトルにもある通り、他シェルを呼び出した際に呼び出し元で作った変数は共有されない問題にハマりました。

  • main_script.sh
# !/bin/bash -ex

APP_NAME='World'

echo "Hello ${APP_NAME}!!"

sh ./sub_shell.sh
  • sub_script.sh
# !/bin/bash -ex

echo "Hello ${APP_NAME}2!!"

理想は、Hello World2!!と表示されるはずと思い込んでましたが実際は次の結果です。

$ sh main_shell.sh 
Hello World!!
Hello 2!!

対策: main_script.shに変数を依存させない

原因は、変数が特定のシェルスクリプト内に依存してしまっているため他のシェルに共有できないのです。

CI/CDツールでは、前もってビルドオプションから変数を作ることができるので、Jenkinsであれば設定からビルドのパラメータ化で対応し、CircleCIであれば設定からEnvironment Variablesに変数を作るなど、ツール内のなんらかの設定関連から変数作りが対応できると思います。

または、exportとsourceでCI/CDが動いているマシンに変数を作って共有する方法もあります。
一見するとこの対応でも良さそうですが、例えばJenkinsの場合、共有PCで起動させている際は全ジョブに対して共有されるので注意が必要です。

CI/CD対応ではなくこの問題を解決する場合は、テキストファイルに環境変数をまとめてそのファイルを各シェル内で読み込んで変数をを利用する方法があります。
 

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?