set コマンド

シェルオプションと位置パラメータを表示または設定します。

概要

set コマンドは、シェルオプションと位置パラメータを表示または変更するために使用されます。引数なしで実行すると、すべてのシェル変数を表示します。オプションを指定すると、様々な機能を有効化または無効化することでシェルの動作を変更します。また、現在のシェルの位置パラメータ($1, $2, など)を設定するためにも使用できます。

オプション

-e

コマンドが非ゼロステータスで終了した場合、即座に終了します。

$ set -e
$ non_existent_command
bash: non_existent_command: command not found
$ echo "これは実行されません"
[前のエラーによりシェルはすでに終了しています]

-x

コマンドとその引数が実行される際に表示します(トレースモード)。

$ set -x
$ echo "Hello World"
+ echo 'Hello World'
Hello World

-u

未設定の変数を置換する際にエラーとして扱います。

$ set -u
$ echo $UNDEFINED_VARIABLE
bash: UNDEFINED_VARIABLE: unbound variable

-o pipefail

パイプラインの戻り値は、非ゼロステータスで終了した最後のコマンドのステータスになります。非ゼロステータスで終了したコマンドがない場合は0になります。

$ set -o pipefail
$ false | true
$ echo $?
1

-

-x および -v オプションをオフにします。

$ set -x  # トレースを有効化
$ echo "トレース付き"
+ echo 'トレース付き'
トレース付き
$ set -    # トレースを無効化
$ echo "トレースなし"
トレースなし

--

オプション処理を終了します。残りの引数は位置パラメータになります。

$ set -- arg1 arg2 arg3
$ echo $1 $2 $3
arg1 arg2 arg3

使用例

位置パラメータの設定

$ set -- "最初の引数" "2番目の引数" "3番目の引数"
$ echo $1
最初の引数
$ echo $2
2番目の引数
$ echo $3
3番目の引数

複数のオプションを一度に有効化

$ set -exu
$ echo "このコマンドはトレースされ、スクリプトはエラーや未設定変数で終了します"
+ echo 'このコマンドはトレースされ、スクリプトはエラーや未設定変数で終了します'
このコマンドはトレースされ、スクリプトはエラーや未設定変数で終了します

すべてのシェル変数の表示

$ set | head -5
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()

ヒント:

シェルスクリプトでの使用

シェルスクリプトの先頭に set -e を追加することは、エラーが発生した際に潜在的に不正な実行を続けるのではなく、スクリプトを早期に失敗させるための良い習慣です。

スクリプトのデバッグ

シェルスクリプトのトラブルシューティングでは、set -x が実行されているコマンドとその値を正確に確認するために非常に役立ちます。

より安全なスクリプト

set -euo pipefail の組み合わせは、エラー、未設定変数、パイプライン失敗時に失敗することで、より堅牢なシェルスクリプトを作成するために一般的に使用されます。

オプションのリセット

set -x で有効化されたトレースをオフにするには set +x を使用します。プラス記号はマイナス記号で有効化されたオプションを無効化します。

よくある質問

Q1. setexport の違いは何ですか?

A. set はシェルオプションと位置パラメータを表示/変更するのに対し、export は変数を子プロセスで利用可能にします。

Q2. 設定したオプションをオフにするにはどうすればよいですか?

A. - の代わりに + 記号を使用します。例えば、set +xset -x で有効化されたトレースをオフにします。

Q3. 現在のすべてのシェル変数を確認するにはどうすればよいですか?

A. 引数なしで set を実行するだけで、すべてのシェル変数が表示されます。

Q4. set -e は何をしますか?

A. 非ゼロステータス(エラーを示す)でコマンドが終了した場合、シェルを即座に終了させます。

参考文献

https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html

改訂履歴