Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2722

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

$
0
0

概要

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

問題

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

  • main_script.sh
#!/bin/bash -exAPP_NAME='World'echo"Hello ${APP_NAME}!!"

sh ./sub_shell.sh
  • sub_script.sh
#!/bin/bash -execho"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対応ではなくこの問題を解決する場合は、テキストファイルに環境変数をまとめてそのファイルを各シェル内で読み込んで変数をを利用する方法があります。
 


Viewing all articles
Browse latest Browse all 2722

Trending Articles