5.5.3 関数情報配列
adshexecコマンドが実行する関数の情報は,一次元配列である関数情報配列に格納されます。
関数情報配列の使用有無は環境設定パラメーターVAR_SHELL_FUNCINFOで定義します。配列名も環境設定パラメーターVAR_SHELL_FUNCINFOの指定によって決まります。環境設定パラメーターVAR_SHELL_FUNCINFOについては,「VAR_SHELL_FUNCINFOパラメーター(関数情報配列の使用有無を選択する)」を参照してください。
関数情報配列の特徴は次のとおりです。
-
関数情報配列はジョブ定義スクリプトの実行時から終了まで存在します。ただし,.ENVファイル内で関数を実行した場合,関数情報配列は存在しません。
-
要素数の範囲は0〜65,535です。
-
属性は文字列書式属性へ変更できます。属性を関数内ローカル変数へ変更することはできません。
-
関数情報配列は読み込み専用属性です。そのため,配列の値の参照はできますが,値の設定や配列の無効化はできません。
- 〈この項の構成〉
(1) 関数情報配列の種類
関数情報配列には次の表に示す種類があります。
配列の種類 |
説明 |
配列名 |
|
---|---|---|---|
VAR_SHELL_FUNCINFOにTYPE_Aを指定した場合 |
VAR_SHELL_FUNCINFOにTYPE_Bを指定した場合 |
||
呼び出しスタックにあるすべての関数名を格納する配列です。 要素番号0には現在実行中の関数名を格納します。最も下の要素には"main"を格納します。 シェル標準コマンドの.(ドット)コマンド,およびスクリプト拡張コマンドの#-adsh_scriptで外部スクリプトを呼び出した場合は"source"を格納します。 |
ADSH_FUNCNAME |
FUNCNAME |
|
呼び出しスタックにあるすべての関数が呼び出されたスクリプトファイルの行番号を格納する配列です。 要素番号0には現在実行中の関数を呼び出した行番号を格納します。最も下の要素には"0"を格納します。 外部スクリプトの場合はシェル標準コマンドの.(ドット)コマンド,およびスクリプト拡張コマンドの#-adsh_scriptを実行した行番号を格納します。 属性は整数型へ変更することもできます。 |
ADSH_LINENO |
BASH_LINENO |
|
呼び出しスタックにある関数が定義されたスクリプトファイル名を格納する配列です。 要素番号0には現在実行中の関数を定義したスクリプトファイル名を格納します。最も下の要素にはジョブ定義スクリプト名を絶対パスで格納します。 外部スクリプトの場合は外部スクリプトファイルを絶対パスで格納します。 |
ADSH_SOURCE |
BASH_SOURCE |
- 注※1
-
シグナルや強制終了要求を受けたときにtrapアクション内で関数を呼び出した場合,関数呼び出し行番号配列には,trapアクション内ではなく,trapアクションを呼び出した処理の行番号が格納されます。
例えば,次の定義では行番号4で関数fn1を呼び出していますが,行番号4はtrapアクション内のため,行番号6が配列に格納されます。
1 fn1(){ 2 echo ${ADSH_LINENO[*]} 3 } 4 trap fn1 INT 5 6 kill -INT $$ 7 pwd
- 注※2
-
adshexecコマンドを-rオプションで実行した場合,関数定義スクリプトファイル名配列のスクリプトファイル名には「-r CMDLINE」が格納されます。例を次に示します。
C:\tmp>adshexec -m SIMPLE -r "echo ${ADSH_SOURCE[*]}" -r CMDLINE C:\tmp>
(2) 関数情報配列の構造
次のジョブ定義スクリプト(ファイル名:func.ash)を例に,配列の遷移について説明します。
1 fn3(){ 2 echo "JP1/AS" 3 } 4 fn2(){ 5 fn3 6 } 7 fn1(){ 8 fn2 9 } 10 fn1
このジョブ定義スクリプトを実行すると,配列の状態は関数fn3の実行によって次の図のように遷移します。
(3) 関数情報配列に関する注意事項
-
関数情報配列はジョブ定義スクリプト内で変更できません。そのため,CUIやGUIでのデバッグ時は,値の参照(watch,print,およびinfo variablesコマンド)はできますが,更新(setコマンド)はできません。
-
関数情報配列をエクスポートすると,次のように動作します。
-
配列ではなく,変数として要素0の内容が引き継がれます。ただし,関数情報配列はジョブ起動時に再設定されるため,子孫ジョブの場合は上書きされてしまいます。
-
子孫ジョブの稼働実績情報には,上書き前のエクスポートされた値が出力されます。
-
-
#-adsh_step_startコマンドのstepVar属性には,関数情報配列の名称は指定できません。指定するとKNAX6312-Eメッセージを出力してエラー終了します。
-
【Windows版限定】関数定義スクリプトファイル名配列には「\」を含むスクリプトファイルの絶対パスが格納されます。echoコマンド,printコマンドではシェル変数展開後の「\」をエスケープ文字として扱います。そのため,echoコマンド,printコマンドで関数定義スクリプトファイル名配列の値を出力する場合は,次のように指定し実行してください。
-
echoコマンドで出力する場合は-Eオプションを指定するか,または環境設定パラメーターESCAPE_SEQ_ECHO_DEFAULTにNOを指定してください。
-
printコマンドで出力する場合は-rオプションを指定してください。
-