.bashrc とかに以下の設定を書いておくと、bash -x
や set -x
状態でスクリプト実行したときに、出力がリッチになってデバッグが捗ります。
# PS4の設定でシェルスクリプトのデバッグが捗る https://qiita.com/kawaz/items/65cdbeaa739c4e6b7776
export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME:+$FUNCNAME(): }'
#サンプルスクリプト
↓こんな感じの2つのスクリプトがあるとします。
test.sh
#!/bin/bash
echo "i am test.sh"
. func.sh
foo hoge
func.sh
#!/bin/bash
echo "i am func.sh"
function foo() {
bar "$@"
}
function bar() {
echo bar "$@"
}
通常の実行例
デフォルトでは PS4='+ '
となっており、その場合の出力は以下のようになります。
+ echo 'i am test.sh'
i am test.sh
+ . func.sh
++ echo 'i am func.sh'
i am func.sh
+ foo hoge
+ bar hoge
+ echo bar hoge
bar hoge
一応source読み込みで入れ子になってるスクリプトで実行されたコマンドは ++ 表記で2段目の入れ子ファイル上のコマンドですよーてことは分かりますがそれだけです。
いい感じの実行例
冒頭のPS4を設定しておくと以下の様な感じになります。
$ bash -x test.sh
+(test.sh:2): echo 'i am test.sh'
i am test.sh
+(test.sh:3): . func.sh
++(func.sh:2): echo 'i am func.sh'
i am func.sh
+(test.sh:4): foo hoge
+(func.sh:4): foo(): bar hoge
+(func.sh:7): bar(): echo bar hoge
bar hoge
ファイル名や実行中コマンドのスクリプト内行番号や、関数中ならその関数名まで表示してくれます。便利!