6.1.5 ジョブ定義スクリプトの構成要素に対する停止可否
ジョブ定義スクリプトの各要素に対して,停止できるかどうかを次の表に示します。次の表で示す要素では,ブレークポイントや逐次実行などによる停止ができます。
表6-3 ジョブ定義スクリプトの各要素に対しての停止可否
ジョブ定義スクリプトで使用する要素 | 内容 | 停止の可否 |
---|
for文 | for文であることを示します。 | ○ |
case文 | case文であることを示します。 | ○ |
if文 | if文であることを示します。 | ○ |
while文 | while文であることを示します。 | ○ |
until文 | until文であることを示します。 | ○ |
elif文 | elif文であることを示します。 | ○ |
else文 | else文であることを示します。 | × |
caseのパターン文 | case文に指定するパターン文であることを示します。パターン文の内部の処理は含みません。 | × |
条件文の終端 | if文,elif文のthen,またはfor文,while文,until文のdoなど,条件文の終端を示します。 | × |
ブロック終端 | for文,while文,until文のdone,case文のesac,if文のfiなど,ブロック終端を示します。 | × |
関数定義開始 | 関数定義開始を示します。 | × |
関数定義終了 | 関数定義終了を示します。 | × |
関数実行開始 | 関数が開始することを示します。 | ○ |
関数実行終了 | 関数が終了することを示します。 | × |
スクリプト拡張コマンド | #-adshで始まるスクリプト拡張コマンドを示します。 | ○ |
シェル標準コマンド | シェルに組み込まれたコマンドを示します。 | ○ |
外部コマンド | 実行可能な外部コマンドを示します。 | ○ |
代入演算,算術演算 | 代入演算および算術演算を示します。 | ○ |
ジョブ定義スクリプト終端(EOF) | メインのジョブ定義スクリプトが終了することを示します。 | ○ |
コメントおよびスペース | コメントおよびスペースを示します。 | × |
- (凡例)
- ○:停止できます。
- ×:停止できません。
- 注意事項
- 別プロセスで実行されるコマンドでは停止しません。
例
1: funcA(){
2: a=100
3: echo $a
4: }
5: funcA &
6: pwd
上記ジョブ定義スクリプトで,5行目の「funcA &」の実行前で停止しているときにstepコマンドを実行すると,6行目の「pwd」の実行前で停止します。&の指定によって,関数funcAの内部のコマンドは別プロセスで実行されるため,停止しません。
- シェルコマンドの引数に指定したコマンドでは停止しません。
- Windowsの場合,シェルコマンドの引数にコマンド置換を指定すると,引数部分の実行前で1回停止でき,そのあと実際のコマンドの実行前で1回停止できます。また,コマンド置換を引数ではなくコマンドとして実行する場合でも,実行時に2回停止できます。
UNIXの場合,シェルコマンドの引数にコマンド置換を指定すると,コマンド全体の実行前に1回だけ停止できます。例を次に示します。
例
Windowsの場合
echo `pwd` ←「`pwd`」の実行前と「echo」の実行前で1回ずつ停止できます。
`echo pwd` ←「`echo pwd`」の実行前で2回停止できます。
UNIXの場合
echo `pwd` ←「echo `pwd`」の実行前で1回停止できます。
`echo pwd` ←「`echo pwd`」の実行前で1回停止できます。
- スクリプト拡張コマンドを継続行で指定した場合,それぞれの行で停止できます。ただし,実際にスクリプト拡張コマンドが実行されるのは,最後の継続行を実行したときです。
- 代入演算のあとにスペース区切りでコマンドを指定した場合,デバッガのsetコマンドによる変数の書き換えは,先頭の代入演算での停止時に行ってください。また,各コマンドで停止するとき,それらのコマンド名には変数展開後の文字列が表示されます。
- ジョブ定義スクリプト終端(EOF)にブレークポイントを設定できません。ただし,EOFではウォッチポイント,逐次実行および停止シグナルの受信によって停止できます。
- シェルのtrapコマンドのactionを実行中の場合,ブレークポイントで停止しません。ただし,ウォッチポイント,逐次実行および停止シグナルの受信によって停止できます。
- timeコマンドの引数に関数呼び出しを指定して実行した場合,呼び出された関数内でウォッチポイントまたは停止シグナルの受信によって停止判定を満たすと,timeコマンドを実行したあとに停止できるコマンドの実行前で停止します。
- コマンドをグループ化(子プロセスで実行)している場合,「)」が記述されている部分に停止できます。ただし,「)」の位置で停止しているとき,グループ化されたコマンド群は実行していない状態です。また,ブレークポイントも同様に,「)」が記述されている行に設定できます。「)」が記述されている行以外の行にブレークポイントを設定しようとすると,自動的に「)」が記述されている行に設定されます。例を次に示します。
例
1: ( ←停止できない
2: pwd ←停止できない
3: date ←停止できない
4: ) ←停止できる
- コマンドを「{}」で括ってグループ化し,「&」などを付加して別プロセスでの実行を指定した場合,ブレークポイントを設定するとき,グループ化を1行で記述してください。複数行にわたって記述すると,設定したブレークポイントで停止できません。例を次に示します。
例
1行で指定する場合
1: { pwd; date;} &
設定したブレークポイントで停止できない場合
1: echo "test"
2: { ←設定および停止できない
3: pwd ←設定できるが,停止できない
4: date ←設定できるが,停止できない
5: } & ←設定できないが,停止できる
上記の例では,3行目および4行目にブレークポイントを設定できますが,停止はできません。実際に停止できるのは5行目です。例えば,グループ化したコマンド群の1個前のコマンド(例では1行目のecho)から逐次実行した場合,5行目で停止できます。また,「}」の位置で停止している場合,グループ化したコマンド群は実行していない状態です。
- コマンド置換だけをコマンドとして記述した場合,停止できる位置はコマンド置換の終端記号が記述されている行です。ただし,終端記号の位置で停止している場合,コマンド置換は実行していない状態です。ブレークポイントも同様に,終端記号の記述されている行に設定できます。終端記号の記述されている行以外の行にブレークポイントを設定すると,自動的に終端記号の記述されている行に設定されます。例を次に示します。
例1
1: $( ←停止できない
2: echo pwd ←停止できない
3: ) ←停止できる
例2
1: `echo pwd` ←停止できる
- コマンド置換だけをコマンドとして記述した場合およびbuiltinコマンド,commandコマンド,timeコマンドの引数にコマンド置換だけを記述した場合,コマンド置換の次のコマンドの実行前で停止したいときは,コマンド置換の結果がNULL,スペースおよびコメントのどれにもならないようにしてください。