bashでシェルスクリプトをデバッグする方法【xオプションの使い方】

シェル/bash

bashでデバッグしたい人

bashでデバッグする方法を知りたい人
「bashをデバッグモードで動かしたいです。有効なオプションを教えてください。ソースコードを修正しなくてもデバッグモードで動かせますか?」

こんな悩みに答えます。結論から言うと、bashをデバッグ実行するにはbashコマンドにxオプションを指定するだけです。

この記事を書いた私は、年収1,000万円ちょっとのエンジニア。高校生の頃から約20年間、bashやtcsh、zshのようなシェルスクリプトのほか、C/C++,Java,SML,Ocamlなど様々なプログラミング言語を扱ってきました。

数あるプログラミング言語の中でも、bashのようなスクリプト言語は簡単かつ効率的に処理を行うことができるのが特徴です。

今回はbashのデバッグの仕方を解説します。

本記事の内容

  • ①bashをデバッグ実行するベーシックな方法
  • ②実行時、常にデバッグする方法
  • ③スクリプトファイルを読み込みながらデバッグ実行する方法

bashをデバッグ実行する方法

bashをデバッグするにはxオプションを指定します。コマンドの構文は以下の通りです。

bash -x 《ファイル名》

helloというbashのスクリプトファイルをデバッグするには次のようにします。プログラムの中身は、echoするだけの単純なスクリプトです。

$ cat ./hello                                                                                              #!/bin/bash

echo "Hello, World"
$ bash -x ./hello
+ echo 'Hello, World'
Hello, World

実行時、常にデバッグする方法

一回限りではなく常にデバッグモードで動かしたい場合は、スクリプトファイル内の1行目にオプションを記述することができます。

$ cat ./hello2
#!/bin/bash -x

echo "Hello, World"
$ ./hello2
+ echo 'Hello, World'
Hello, World

この記述は、不具合のあるプログラムの再現テストをする際など、プログラム実行時のデバッグログを残したい時に便利です。

デバッグログは標準エラー出力

なお、デバッグログは次のように標準出力ではなく標準エラー出力に出ますのでご注意ください。

$ ./hello2 2> ../log/hello2.log
Hello, World
$ cat ../log/hello2.log
+ echo 'Hello, World'

スクリプトファイルを読み込みながらデバッグ実行する方法

最後にスクリプトファイルを読み込みながらデバッグ実行する方法を解説します。

cat 《ファイル名》 | bash -x

この構文のプログラム例を以下に示します。

$ cat ./hello                                                                                              #!/bin/bash

echo "Hello, World"
$ cat ./hello | bash -x
+ echo 'Hello, World'
Hello, World

この構文は、プログラムを動的に変更しながら実行する場合に便利です。

次の例では、同じプログラムをsedコマンドで動的に書き換えながらデバッグ実行します。

  • (動的な書き換えその1) Hello, WorldをHello, Japanにする
  • (動的な書き換えその2) 5秒sleepするようにする
% cat ./hello | sed -e 's/"Hello, World"/"Hello, Japan";sleep 5/g'| bash -x
+ echo 'Hello, Japan'
Hello, Japan
+ sleep 5

Blog TOP  シェルスクリプトを勉強したい人向け|bashの使い方 記事まとめ

bashの使い方 - もくじ

bashの使い方 - もくじ

シェルとは

 - シェルとは
 - シェルはOSと会話するための言語
 - シェルの種類(bash以外のシェル)
 - シェルスクリプトとは
 - シェルスクリプトの書き方

条件式

 - if else文
 - 文字列の比較
 - &&と||の使い方
 - case文

文字列操作

 - 文字列の連結
 - 文字列の一部を切り出す

繰り返し

 - for文
 - while文
 - while文でリストから1つ要素ずつ処理する

定数

 - 定数の定義

関数

 - 関数の定義

デバッグ

 - デバッグオプション(-x)

実行権限

 - 実行権限のないシェルスクリプトファイルを実行する

 - シェルスクリプトの書籍3選