読者です 読者をやめる 読者になる 読者になる

らくがきちょう

なんとなく

スクリプト中で実行しているコマンドを表示する

普通にシェルスクリプトを書くと実行結果のみが表示され、『実行しているコマンドそのもの』は表示されません。「試験結果のエビデンスとして、結果と共にコマンドも残したい」「スクリプトデバッグしたい」といった場合は実行結果だけでなく、実行したコマンドも表示されると便利です。今回は「スクリプト中で実行しているコマンドも表示する方法」をメモします。

/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