IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

WSLで始めるUbuntu

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第29回 環境変数、終了コードについて知ろう (宮崎悟) 2021年3月

前回は、単語分割とパス展開について説明しました。今回は環境変数と終了コードについて説明します。

環境変数

プログラムの起動時には、環境(environment)と呼ばれる文字列の配列が渡されます。これは「変数名=値」のペアからなるリストです。

bashは、環境を操作する様々な方法を提供しています。bash起動時にbashは自分自身の環境を調べ、見つかった変数名それぞれに対してパラメータを生成し、それに自動的に子プロセスへのエクスポート(export)の印を付けます。実行されたコマンドは環境を継承します。export/declare-xコマンドを用いて、パラメータや関数の追加と削除を環境に対して行います。環境内のパラメータ値が変更されると、新しい値は古い値と置き換わります。実行されたコマンドが継承する環境は、以下の変更を行ったものになります。

  • bashの最初の環境から、変数の値がシェル中で変更された
  • 一部の変数ペアがunsetコマンドで削除された
  • exportコマンドやdeclare -xコマンドで追加された

単純なコマンドや関数に対する環境は、一時的に修正できます。これは、パラメータへの代入を前に置くことで行います。このような代入が影響を与えるのは、そのコマンドが参照する環境だけです。

# 環境変数の設定(1)
$ AAA=bbb
$ export AAA
# 環境変数の設定(2)
$ export BBB=ccc
# 環境変数の削除
$ unset AAA BBB
# LC_ALLに何も指定しないときはデフォルトのロケール
$ ls -l
合計 0
-rwxrwxrwx 1 user    user    0  5月 11  2020 aaa
-rwxrwxrwx 1 user    user    0  5月 11  2020 bbb
-rwxrwxrwx 1 user    user    0  5月 11  2020 ccc
# LC_ALL=C を指定すると、このコマンドのみCロケールで表示される
$ LC_ALL=C ls -l
total 0
-rwxrwxrwx 1 user    user    0 May 11  2020 aaa
-rwxrwxrwx 1 user    user    0 May 11  2020 bbb
-rwxrwxrwx 1 user    user    0 May 11  2020 ccc

set -kを実行すると、コマンド名の前に置いたものだけではなく、全てのパラメータ代入がそのコマンドの環境に影響を与えます。

終了ステータス

実行したコマンドの終了ステータスは、waitpid()システムコールまたはそれに相当する関数が返した値です。終了ステータスは0から255の値を取りますが、125より大きい値は特別にシェルによって使われることがあります。シェルの組み込みコマンドや複合コマンドの終了ステータスも、同じ範囲に限定されています。環境によっては、シェルは仕様で決められた失敗のモードを表す特別の値を使います。

シェルは、終了コード0で終了したコマンドは正常終了したとみなします。0以外の終了コードは失敗を示します。あるコマンドが致命的なシグナルNで終了したときには、bashは「128+N」の値を終了ステータスに使います。

コマンドが見つからなかった場合には、そのコマンドを実行するために生成された子プロセスがステータス127を返します。コマンドが見つかったけれど実行できなかった場合には、終了ステータス126を返します。

展開やリダイレクションの際にエラーが発生し、実行に失敗した場合には、0より大きい終了ステータスを返します。

シェルの組み込みコマンドは、成功した場合にはステータス0(真)を返し、実行中エラーが発生したときには0以外(偽)のステータスを返します。組み込みコマンドは全て、正しくない使い方であることを示すのに終了ステータス2を返します。

bash自身が返す終了ステータスは、文法エラーが起きた場合を除き、実行した最後のコマンドの終了ステータスです。文法エラーの場合には0でない値が終了ステータスとなります。

コマンド終了後、終了ステータスはシェル変数$?に保管されます。ただし、コマンドを起動するたびに$?は変更されるのに注意してください。

終わりに

今回は環境変数と終了コードについて説明しました。次回はシグナルとジョブコントロールについて説明します。次回をお楽しみに。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes