CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
前回は、単語分割とパス展開について説明しました。今回は環境変数と終了コードについて説明します。
プログラムの起動時には、環境(environment)と呼ばれる文字列の配列が渡されます。これは「変数名=値」のペアからなるリストです。
bashは、環境を操作する様々な方法を提供しています。bash起動時にbashは自分自身の環境を調べ、見つかった変数名それぞれに対してパラメータを生成し、それに自動的に子プロセスへのエクスポート(export)の印を付けます。実行されたコマンドは環境を継承します。export
/declare-x
コマンドを用いて、パラメータや関数の追加と削除を環境に対して行います。環境内のパラメータ値が変更されると、新しい値は古い値と置き換わります。実行されたコマンドが継承する環境は、以下の変更を行ったものになります。
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