シェルスクリプトをデバッグしていてよく使うオプションを5つ紹介します!
/bin/bash -e ./script.sh
シェルスクリプトの中でエラー(終了ステータスが0以外)が発生した場合、そこでスクリプトを終了します。
ただし、自分の意図と反して終了することもあるので注意が必要。
(diffで差分があったときの終了ステータスが1だと知らず結構ハマりました。)
実行例
スクリプトの内容
#!/bin/bash diff foo.txt bar.txt echo "wawawa"
結果
kabegiwa$ /bin/bash -e ./script.sh 1c1 < foo --- > bar
最後のecho "wawawa"
が実行されていないことがわかる
/bin/bash -u ./script.sh
定義されていない変数が使われた際にそこでエラー終了とするオプションです。
たとえば以下のようなスクリプトを実行した時にrm -rf /
が発行されるのを防いでくれます。
実行例
スクリプトの内容
path=wawawa/tmp rm -rf /${pasu}
結果
kabegiwa$ /bin/bash -u ./script.sh ./script.sh: 行 3: pasu: 未割り当ての変数です
/bin/bash -x ./script.sh
シェルスクリプトで実行した結果を変数の仲間で含めてすべて標準出力してくれます。
実行例
スクリプトの内容
foo=wawawa bar=sasasa echo ${foo} echo ${bar}
結果
kabegiwa$ /bin/bash -x ./script.sh + foo=wawawa + bar=sasasa + echo wawawa wawawa + echo sasasa sasasa
/bin/bash -v ./script.sh
これもデバッグで利用できるものですが、/bin/bash -x
オプションとは違い、変数をそのまま変数名で表示してくれます。
実行例
スクリプトの内容
foo=wawawa bar=sasasa echo ${foo} echo ${bar}
/bin/bash -x
とスクリプトの内容は同じ
結果
kabegiwa$ /bin/bash -x ./script.sh #!/bin/bash foo=wawawa bar=sasasa echo ${foo} wawawa echo ${bar} sasasa
/bin/bash -n ./script.sh
実際にシェルスクリプトを実行することなく文法チェックをすることができます。
実行例
結果(文法に問題がない場合)
kabegiwa$ /bin/bash -n ./script.sh kabegiwa$
なにも出力されない
結果(文法に問題がある場合)
kabegiwa$ /bin/bash -n ./script.sh script.sh: 行 6: 予期しないトークン `fi' 周辺に構文エラーがあります script.sh: 行 6: `fi'