Bash xtraceオプション: コマンド展開のデバッグ


前提


ドキュメント


Bashのコマンド展開をデバック

Bashに入力した文字列は、コマンドに渡される前に、8種類の展開が行われる。

適用順番やそれぞれ細かいルールがある。

xtraceオプション有効でデバッグ

実際にコマンドに渡される環境・引数を確認できる。

デバッグ表示例

echo {1..3} # ブレース展開
+ echo 1 2 3
1 2 3

カレントシェルでデバッグ: set -x


シェルスクリプトでデバッグ: bash -x

bash -xを使わず、スクリプトのデバッグしたい部分でset -x、解除したい部分でset +xでもよい。

#!/bin/bash
echo {9..7}

実行結果

+ echo 9 8 7
9 8 7

verboseオプション併用: bash -xv

実行結果

#!/bin/bash
echo {9..7}
+ echo 9 8 7
9 8 7

デバッグ例: 変数一時代入はコマンド引数に影響しない

#!/bin/bash
a=abc
a=xyz echo $a # 変数一時代入

実行結果

#!/bin/bash
a=abc
+ a=abc
a=xyz echo $a # 変数一時代入
+ a=xyz
+ echo abc
abc

デバッグ例: @と*の違い

#!/bin/bash
array=(a b c)
echo "${array[@]}" # 引数は三つ
echo "${array[*]}" # 引数は一つ

実行結果

+ array=(a b c)
+ echo a b c
a b c
+ echo 'a b c'
a b c