はじめに
こんにちは!今回はsetコマンドについて解説します。
setは、シェルの動作を制御するためのコマンドです。特にシェルスクリプトでエラー処理を厳密にしたり、デバッグしたりする時に超重要です。
setコマンドとは
setは、シェルのオプションや位置パラメータを設定する組み込みコマンドです。
例えば、「エラーが起きたらスクリプトを止める」とか「未定義の変数を使ったらエラーにする」とか、シェルの挙動を細かく制御できます。プロのシェルスクリプトには必須のコマンドです。
基本構文
|
|
主なオプション
| オプション | 説明 |
|---|---|
-e |
コマンドがエラーで終了したらスクリプトを終了 |
-u |
未定義変数を使用したらエラー |
-x |
実行するコマンドを表示(デバッグ用) |
-o pipefail |
パイプライン内のコマンドが失敗したら全体を失敗扱い |
-v |
入力行を読み込んだら表示 |
-n |
コマンドを読むだけで実行しない(構文チェック) |
+オプション |
オプションを無効化(例: +xでデバッグ表示をオフ) |
使用例
例1: エラーで即座に終了する(-e)
|
|
実行結果:
|
|
set -eを使うと、エラーが起きた時点でスクリプトが停止します。これで問題のあるまま処理が進むのを防げます。
例2: 未定義変数をエラーにする(-u)
|
|
実行結果:
|
|
変数の typo とか防げるので便利です。
例3: 実行コマンドを表示する(-x)
|
|
実行結果:
|
|
各コマンドの実行前に+付きで表示されます。デバッグに超便利。
例4: パイプラインのエラーを検出(-o pipefail)
|
|
普通だとパイプラインの最後のコマンド(sort)の結果しか見ないけど、pipefailを使うと途中のエラーも検出できます。
例5: 複数のオプションを同時に設定
|
|
この3つの組み合わせは「安全なシェルスクリプト」の基本設定として有名です。
例6: デバッグモードのオン/オフ
|
|
実行結果:
|
|
set +xで元に戻せます。
例7: 位置パラメータを設定
|
|
実行結果:
|
|
--の後に指定した値が位置パラメータ($1, $2, $3…)に設定されます。
例8: 現在の設定を確認
|
|
実行結果:
|
|
現在のシェルオプションの状態が一覧表示されます。
よく使う組み合わせ
安全なスクリプトの基本設定
|
|
この設定は「Bash Strict Mode」として広く推奨されています。
デバッグ用の設定
|
|
構文チェックのみ
|
|
Tips・注意点
-
-eの落とし穴: if文やwhile文の中では-eが無効になる
1 2 3 4set -e if false; then # ここではエラーにならない echo "This won't run" fi -
エラーハンドリングとの併用: trapと組み合わせると強力
1 2set -e trap 'echo "Error on line $LINENO"' ERR -
一時的にオプションを変更: 必要な部分だけオンにできる
1 2 3set +e # エラーで止まらないようにする risky_command # 失敗しても続行したい set -e # また厳密モードに戻す -
IFS(Internal Field Separator)の変更: setではなくIFS変数を直接設定
1 2# 空白ではなくカンマで分割したい時 IFS=',' -
位置パラメータのクリア:
set --で全部クリアできる1 2set -- apple banana set -- # $1, $2 などがクリアされる
実践的な使い方
本番環境用スクリプト
|
|
エラーが起きた行番号も表示されるので、デバッグが楽です。
デバッグ用スクリプト
|
|
使い方:
|
|
配列を位置パラメータに展開
|
|
エラーが起きても続行したい場合
|
|
パイプラインのエラー検出
|
|
スクリプトの冒頭テンプレート
|
|
この設定をテンプレートにしておくと、安全なスクリプトが書けます。
setとshoptの違い
shoptも似たようなコマンドですが、役割が違います。
|
|
基本的にはsetを使って、Bash特有の機能が欲しい時だけshoptを使います。
まとめ
今回はsetコマンドについて解説しました。
ポイント:
setでシェルの動作を制御できる-eでエラー時即座に終了(推奨)-uで未定義変数をエラーに(推奨)-xでデバッグ表示(開発時に便利)-o pipefailでパイプラインのエラー検出(推奨)set -euo pipefailが安全なスクリプトの基本
シェルスクリプトを書く時は、最初にset -euo pipefailを書いておくのがおすすめです。エラーの早期発見につながって、バグが減ります。
次回もLinuxコマンドの学習を続けていきましょう!