はじめに
Linuxのコマンドラインを扱う上で、シェルの動作そのものを細かく制御したり、ローカル変数の一覧を確認したりする際に不可欠なのが、シェル組み込みコマンドのsetです。envやexportが環境変数を扱うのに対し、setは主にシェルオプションとローカル変数を管理します。
この記事では、setコマンドの基本的な使い方から、そのコマンド名の由来、そして特にシェルスクリプトで重要なシェルオプションの操作について詳しく解説していきます。
setコマンドの基本
まずは、setコマンドの基本的な使い方と、よく使うオプションから見ていきましょう。
setコマンドの書式
set [オプション] [引数...]
- ポイント: オプションや引数を付けずに
setと入力すると、現在シェルで設定されている全てのローカル変数と環境変数が一覧表示されます。 - 最も重要な使い方は、シェルオプションの有効化/無効化(例:
set -o/set +o)です。
主要オプション一覧
| オプション | 意味 | 補足 |
-o | シェルオプションの設定を表示・有効化する | option |
+o | シェルオプションを無効化する | option |
-u | 未定義の変数を参照した際にエラーにする | unset |
-e | 実行したコマンドがエラー終了した場合にスクリプトを終了する | exit |
--- | オプションの終わりを示し、以降の引数を位置パラメータとして扱う |
コマンド名の由来:なぜ「set」なのか?
setコマンドの「set」は、英語で “設定する” や “定める” という意味を持ちます。
このコマンドの目的は、シェル内部の様々な設定(settings)や値(values)を操作することにあります。具体的には、シェル全体の動作を制御するオプションを設定したり、あるいはシェル内部で使われる変数のリストを「定める」ために使われます。
これは、シェルの「裏側」の動作を直接制御するための、非常に基本的な組み込みコマンドとしての役割を反映した名前です。
各オプションの詳細と実践例
ここからは、setコマンドの主要な機能である変数の一覧表示と、シェルオプションの操作について詳しく掘り下げていきます。
1. 変数の一覧表示
setコマンドを単独で実行すると、現在のシェルに設定されている全ての変数(ローカル変数と環境変数の両方)が「変数名=値」の形式で表示されます。
実践例:
現在の変数を全て表示:
set

注意: envコマンドは環境変数のみを表示するのに対し、setコマンドはローカル変数を含む全てを表示するため、通常はenvの出力よりも遥かに多くなります。
2. シェルオプションの操作
set -oまたはset +oを使うことで、シェルの動作に関するオプション(shoptコマンドでも設定可能)を操作できます。
- 有効化:
set -o オプション名 - 無効化:
set +o オプション名
実践例:
set -o: 現在設定可能な全てのシェルオプションのステータスを表示:
set -o

allexportを有効化:
set -o allexport

※一番上のallexportがonになっていることがわかります。
allexportを無効化:
set +o allexport

※一番上のallexportがoffになったことがわかります。
3. -u (unset) オプション:未定義変数を参照した際のエラー
意味: 未定義の変数を参照しようとした場合(例: echo $UNDEFINED_VAR)、その時点でエラーとして扱い、スクリプトの実行を停止します。デバッグやスクリプトの堅牢性向上に非常に役立ちます。
有効化:
set -u

※最初に未定義のUNDEFINED_VARをechoで出力した際は空白行として表示されましたが、set -uを実行後は「未割り当ての変数です」という表示がされるようになりました。また、set +uを実行することで設定を元に戻すことができます。
ちなみにこのset -uは、set -o nounsetと同様です。nounsetという項目の有効化/無効化を -u/+uで実行可能ということです。

オプションの由来:「-uオプションのuは、unset(未設定の)変数を参照した際の動作を制御することに由来します。これは、未定義変数による予期せぬ動作を防ぎたいというニーズに応えるために導入されました。」
4. -e (exit) オプション:エラー時の自動終了
意味: 実行したコマンドがゼロ以外の終了ステータス(エラー)を返した場合、その時点でシェルスクリプトの実行を即座に終了します。これにより、エラー発生後もスクリプトが意図せず実行され続けるのを防ぎます。
有効化:
set -e

※始めに存在しないファイル(non_existent_file.txt)をcatコマンドで表示しようとした際は存在しない旨の文章が表示されましたが、set -e後に同様のコマンドを実行すると、同様の文章は表示されずにプロンプトが閉じられます。(スクショの最後の行を実行後、自動で閉じられてしまいます。)
ちなみにこのset -eは、set -o errexitと同様です。errexitという項目の有効化/無効化を -e/+eで実行可能ということです。
オプションの由来:「-eオプションのeは、exit(終了)の頭文字から来ています。プログラムがエラーを返した場合、直ちにスクリプトの実行を終了させたいという目的に基づいています。」
5. 位置パラメータ(, , …)の操作
setコマンドにオプションなしで引数を渡すと、その引数がシェルの位置パラメータ($1, $2, ...)として設定されます。
実践例:
位置パラメータを設定:
set apple banana cherry
echo "1: $1, 2: $2, All: $@"


LPIC対策としてのポイント
setコマンドは、特にシェルスクリプトの信頼性を高めるためのオプションとして重要です。
- 変数表示の違い:
setvsenvの違い(setはローカル変数も表示)を理解しておく。 - スクリプトの堅牢性:
set -euは、堅牢なスクリプトを書く際のベストプラクティスとしてよく使われる組み合わせです。set -e:エラー発生時にスクリプトを中断させる。set -u:未定義変数の参照によるバグを防ぐ。
まとめ
今回は、シェルの設定と変数を操作する組み込みコマンドsetについて、その基本的な使い方からコマンド名の由来、そして主要オプションまでを詳しく解説しました。setコマンドを使いこなすことは、シェルスクリプトのデバッグや、コマンドライン環境を自分好みにカスタマイズするために不可欠です。
LPICレベル1の試験対策としては、特に-eと-uオプションの役割、そしてenvとの表示内容の違いをしっかりと押さえておきましょう。



コメント