Bash には 処理の実行内容をトレースできる デバッグに便利な オプション "-x" と "-v" があります。
文法チェックの "-n" と同じ様に 色々な方法で指定できます。
$ bash -xv test.sh
#!/bin/bash -xv
set -xv
ちなみに、オプション "-x" は実行された内容を出力し オプション "-v" は実行するなコマンドを出力します。
次のシェルスクリプトで試してみます。
[test.sh]
YESTERDAY=$(date --date "1 day ago")
echo $YESTERDAY
まず普通に実行。
$ bash test.sh
Sun Oct 1 21:55:13 JST 2017
まず オプション "-x" だけを指定。
$ bash -x test.sh ++ date --date '1 day ago' + YESTERDAY='Sun Oct 1 21:55:23 JST 2017' + echo Sun Oct 1 21:55:23 JST 2017 Sun Oct 1 21:55:23 JST 2017
追加で出力された行の先頭に "+" や "++" が付いてます。
"++" は "$()" で実行された部分ですね。
変数が値に転換されています。
次に オプション "-v" だけを指定。
$ bash -v test.sh YESTERDAY=$(date --date "1 day ago") date --date "1 day ago" echo $YESTERDAY Sun Oct 1 21:55:28 JST 2017
こちらは "+" などは付かず、変数もそのままですね。
"$()" の実行が切りだされています。
さらに オプション "-x" "-v" を両方指定。
$ bash -xv test.sh YESTERDAY=$(date --date "1 day ago") date --date "1 day ago" ++ date --date '1 day ago' + YESTERDAY='Sun Oct 1 21:55:44 JST 2017' echo $YESTERDAY + echo Sun Oct 1 21:55:44 JST 2017 Sun Oct 1 21:55:44 JST 2017
実行するコマンド、実行内容が全て出力されました。
また オプション "-x" "-v" の指定を取り消すには オプション "+x" "+v" を指定します。
$ set -x $ YESTERDAY=$(date --date "1 day ago") ++ date --date '1 day ago' + YESTERDAY='Sun Oct 1 22:06:42 JST 2017' $ echo $YESTERDAY + echo Sun Oct 1 22:06:42 JST 2017 Sun Oct 1 22:06:42 JST 2017 $ set +x + set +x $ YESTERDAY=$(date --date "1 day ago") $ echo $YESTERDAY Sun Oct 1 22:06:57 JST 2017 $ set -v $ YESTERDAY=$(date --date "1 day ago") YESTERDAY=$(date --date "1 day ago") date --date "1 day ago" $ echo $YESTERDAY echo $YESTERDAY Sun Oct 1 22:07:09 JST 2017 $ set +v set +v $ YESTERDAY=$(date --date "1 day ago") $ echo $YESTERDAY Sun Oct 1 22:07:20 JST 2017
文法チェックのオプション "-n" と "-v" を組み合わせると 実行せずに、実行内容だけを確認することができます。
$ bash -nv test.sh YESTERDAY=$(date --date "1 day ago") echo $YESTERDAY