普通にシェルスクリプトを書くと実行結果のみが表示され、『実行しているコマンドそのもの』は表示されません。「試験結果のエビデンスとして、結果と共にコマンドも残したい」「スクリプトをデバッグしたい」といった場合は実行結果だけでなく、実行したコマンドも表示されると便利です。今回は「スクリプト中で実行しているコマンドも表示する方法」をメモします。
/bin/sh に「-x」オプションを付与する
/bin/sh や /bin/bash に「-x」オプションを指定すると実行中のコマンドも表示出来ます。以下は man sh からの抜粋です。
-x xtrace Write each command to standard error (preceded by a ‘+ ’) before it is
executed. Useful for debugging.
通常のスクリプト(実行コマンドは表示しない)
以下は何の変哲も無いシェルスクリプトです。
$ cat without_debug.sh
#!/bin/sh
echo "1"
echo "2"
echo "3"
これを実行すると以下の結果になります。
$ ./without_debug.sh
1
2
3
スクリプトのデバッグ(実行コマンドも表示する)
上述の通り、実行しているコマンドも表示させたい場合は /bin/sh に「-x」オプションを指定します。例えば、以下のように書きます。
$ cat with_debug.sh
#!/bin/sh -x
echo "1"
echo "2"
echo "3"
これを実行すると以下の結果になります。結果だけで無く、実行しているコマンドも表示されているのが分かります。
$ ./with_debug.sh
+ echo 1
1
+ echo 2
2
+ echo 3
3
部分的に実行コマンドを表示する
スクリプト全体では無く、「特定部分だけ、実行コマンドを表示する」にはスクリプト中で以下のコマンドを実行します。
コマンド | 意味 |
---|---|
set -x | このコマンドを実行以降、実行コマンドを表示する |
set +x<_i> | このコマンドを実行以降、実行コマンドを表示しない |
例えば以下のようなスクリプトを用意します。挙動を予測しやすいようにコメントを入れてあります。
$ cat with_debug2.sh
#!/bin/sh
set -x
#以降、コマンドを表示する
echo "1"
set +x
#以降、コマンドを表示しない
echo "2"
set -x
#以降、コマンドを表示する
echo "3"
これを実行すると以下の結果になります。「set -x すると、それ以降はコマンドが表示され」「set +x すると、それ以降はコマンドが表示されなくなっている」のが分かります。
$ ./with_debug2.sh
+ echo 1
1
+ set +x
2
+ echo 3
3
スクリプト実行時にシェルを「-x」オプション付きで指定する
以下のスクリプトがあるとします。スクリプトの一行目で #!/bin/sh を指定しています(「-x」オプションは指定していません)。
$ cat without_debug.sh
#!/bin/sh
echo "1"
echo "2"
echo "3"
/bin/sh を指定して実行すると以下の結果になります。実行したコマンドは表示されません。
$ /bin/sh ./without_debug.sh
1
2
3
次は /bin/sh -x を指定して実行してみます。実行したコマンドが表示されます。このようにスクリプトの中身を書き換えなくても、挙動を変えることも出来ます。
$ /bin/sh -x ./without_debug.sh
+ echo 1
1
+ echo 2
2
+ echo 3
3
続いて、以下のスクリプトがあるとします。スクリプトの一行目で #!/bin/sh -x と「-x」オプションを指定しています。
$ cat with_debug.sh
#!/bin/sh -x
echo "1"
echo "2"
echo "3"
/bin/sh を指定して実行してみます。スクリプト中では /bin/sh -x が指定されているにも関わらず、実行したコマンドは表示されません。
$ /bin/sh with_debug.sh
1
2
3
次は /bin/sh -x を指定して実行してみます。実行したコマンドも表示されているのが分かります。
$ /bin/sh -x with_debug.sh
+ echo 1
1
+ echo 2
2
+ echo 3
3
コメント