5.1.11 外部コマンドの指定
ジョブ定義スクリプトの組み込みコマンド以外のプログラムを外部コマンドと総称します。外部コマンドには,UNIX互換コマンド,OSが提供するコマンドおよびユーザーが独自に作成したプログラムなどが該当します。ジョブ定義スクリプト中にこれらをコマンド名として記述することで,外部コマンドを実行できます。
外部コマンドの指定方法を次に示します。
$ 外部コマンドのパス
(1) Windowsでの外部コマンドの実行
(a) 外部コマンドの拡張子の定義
Windowsの場合,拡張子「.com」,「.exe」,「.cmd」,「.bat」の実行ファイルは,ジョブ定義スクリプトから実行できます。ただし,環境変数PATHEXTにこれらの拡張子を登録しておくと,ジョブ定義スクリプトに拡張子の指定が不要になります。
ジョブ定義スクリプトから外部コマンドを実行する場合,環境変数PATHEXTに登録されている拡張子の順に実行されます。例えば,環境変数PATHEXTの値に「.COM;.EXE;」が指定され,シェル変数PATHの示す場所に「ls.com」と「ls.exe」がある場合は,最初に「ls.com」が実行されます。
外部コマンドの検索例を次に示します。環境変数PATHEXTの値が「.COM;.EXE;」である場合,次のように実行されます。
ls ←拡張子がないため,「.com」「.exe」の順に拡張子を付与して検索し実行される。 ls.exe ←拡張子があるため,「ls.exe」が実行される。
ただし,シンボリックリンクを使用して実行ファイルを実行する場合は,シンボリックリンクだけに拡張子を付与して検索をします。シンボリックリンクが指す実行ファイルには拡張子「.com」,「.exe」,「.cmd」,「.bat」のどれかを指定してください。
(b) 外部コマンド実行前の処理のスキップ
外部コマンドを実行する前に,外部コマンドのパス,およびその引数に対して次の処理が実行されます。これらの処理が不要な場合,commandコマンドに-wオプションを指定して,外部コマンドを実行してください。
"(ダブルクォーテーション)の前の「\」を「\\」に変換する処理
"(ダブルクォーテーション)の前に「\」を付与する処理
"(ダブルクォーテーション)で囲む処理(COMPATIBLE_CMD_EXECパラメーターにV10を指定した場合)
commandコマンドの-wオプションについては,「9.3 シェル標準コマンド」の「commandコマンド(コマンドを実行する)」を参照してください。
- 使用例
command -w ."\\prog.exe" "ABC"
(c) バッチファイルの実行時の制限
バッチファイルパス,および引数にスペース,&,(,),[,],{,},^,=,;,!,',+,,,`,~を含むバッチファイルを実行する場合,次の制限があります。
-
バッチファイルは次のように実行してください。
<cmd.exeパス> /c <バッチファイルパス> [<引数1> <引数2> … <引数n>]
-
バッチファイルパスに&,(,),[,],{,},^,=,;,!,',+,,,`,~を含む場合,バッチファイルパス中の記号を"'\でエスケープしてください。
-
スペースまたは&,(,),[,],{,},^,=,;,!,',+,,,`,~を含む引数は,スペースや記号を"'\でエスケープしてください。
-
環境設定パラメーターCOMPATIBLE_CMD_EXECにV10を指定した環境で実行する場合,引数は"で囲まれたものがバッチファイルに渡ります。また,最後の引数は先頭にだけ"が付きます。このため,バッチファイルから引数を参照するときは"を自動的に取り除く%~1, %~2 … %~n の形式で参照してください。
(2) UNIXでの外部コマンドの実行
実行権限が付与された実行形式のバイナリファイルのときは,ジョブ定義スクリプトから実行できます。
また,実行権限の付与されたテキストファイルは,ファイルの先頭に「#!実行プログラムパス」を記述することで,ジョブ定義スクリプトから実行できます。この場合,#!の指定に従って実行プログラムが実行されます。
(3) コマンドの実行方法の優先順序
ジョブコントローラはジョブ定義スクリプトに指定されたファイルを実行する場合,次の順に条件判定してファイルを実行します。
- 【Windows限定】
CHILDJOB_PGMパラメーターの条件を満たした場合,子孫ジョブとして実行します。
CHILDJOB_SHEBANGパラメーターの条件を満たした場合,子孫ジョブとして実行します。
CHILDJOB_SHEBANGパラメーターのデフォルト定義に合致した場合,子孫ジョブとして実行します。
CHILDJOB_EXTパラメーターの条件を満たした場合,子孫ジョブとして実行します。
拡張子がexe,bat,cmd,またはcomのファイルの場合,コマンドとして実行します。
上記条件のどれにも該当しない場合,コマンドの起動に失敗します。ただし,ジョブの実行は継続されます。
- 【UNIX限定】
CHILDJOB_PGMパラメーターの条件を満たした場合,子孫ジョブとして実行します。
ファイルの実行権限がある場合,手順3.以降の判定を実施します。実行権限がない場合,コマンドの起動に失敗しエラー終了します。ただし,ジョブの実行は継続します。
CHILDJOB_SHEBANGパラメーターの条件を満たした場合,子孫ジョブとして実行します。
CHILDJOB_SHEBANGパラメーターのデフォルト定義に合致した場合,子孫ジョブとして実行します。
CHILDJOB_EXTパラメーターの条件を満たした場合,子孫ジョブとして実行します。
ファイルがバイナリファイルの場合,コマンドとして実行します。
ファイルがテキストファイルの場合,スクリプトとして実行します。
#!が指定されている場合は,#!に指定された実行プログラムで実行します。
#!が指定されていない場合は,「/bin/sh」で実行します。
子孫ジョブ関連のパラメーターを同時に指定した場合の使用例を次に示します(test.shは存在し,実行権限ありとします)。
- 例1
- ■環境ファイルの内容
#-adsh_conf CHILDJOB_PGM /bin/sh #-adsh_conf CHILDJOB_SHEBANG /bin/ksh #-adsh_conf CHILDJOB_EXT sh
- ■test.shの内容
#!/bin/ksh echo JP1AS
- ■ジョブ定義スクリプトの内容
/bin/sh ./test.sh
→CHILDJOB_PGMパラメーターが適用され,test.shは子孫ジョブとして実行します。
- 例2
- ■環境ファイルの内容
#-adsh_conf CHILDJOB_PGM /bin/sh #-adsh_conf CHILDJOB_SHEBANG /bin/ksh #-adsh_conf CHILDJOB_EXT sh
- ■test.shの内容
#!/bin/ksh echo JP1AS
- ■ジョブ定義スクリプトの内容
./test.sh
→CHILDJOB_SHEBANGパラメーターが適用され,test.shは子孫ジョブとして実行します。
- 例3
- ■環境ファイルの内容
#-adsh_conf CHILDJOB_PGM /bin/sh #-adsh_conf CHILDJOB_SHEBANG /bin/ksh #-adsh_conf CHILDJOB_EXT sh
- ■test.shの内容
#!/bin/sh echo JP1AS
- ■ジョブ定義スクリプトの内容
./test.sh
→CHILDJOB_EXTパラメーターが適用され,test.shは子孫ジョブとして実行します。
- 例4
- ■環境ファイルの内容
#-adsh_conf CHILDJOB_PGM /bin/sh #-adsh_conf CHILDJOB_SHEBANG /bin/ksh #-adsh_conf CHILDJOB_EXT sh
- ■test.shの内容
#! /opt/jp1as/bin/adshexec echo JP1AS
- ■ジョブ定義スクリプトの内容
./test.sh
→CHILDJOB_SHEBANGパラメーターのデフォルト定義に合致するため,test.shは子孫ジョブとして実行します。
- 例5
- ■環境ファイルの内容
#-adsh_conf CHILDJOB_PGM /bin/sh #-adsh_conf CHILDJOB_SHEBANG /bin/ksh #-adsh_conf CHILDJOB_EXT sh
- ■test.shの内容
#!/bin/ksh echo JP1AS
- ■ジョブ定義スクリプトの内容
/bin/ksh ./test.sh
→CHILDJOB_EXTパラメーター,CHILDJOB_PGMパラメーター,CHILDJOB_SHEBANGパラメーター,CHILDJOB_SHEBANGパラメーターのデフォルト定義のどの定義にも該当しないため,test.shは子孫ジョブとして実行されないで,/bin/kshで実行します。
- 例6
- ■環境ファイルの内容
#-adsh_conf CHILDJOB_PGM /opt/jp1as/bin/adshexec #-adsh_conf CHILDJOB_SHEBANG /bin/ksh #-adsh_conf CHILDJOB_EXT sh
- ■test.shの内容
#!/bin/ksh echo JP1AS
- ■ジョブ定義スクリプトの内容
/opt/jp1as/bin/adshexec ./test.sh
→CHILDJOB_PGMパラメーターが適用され,test.shは子孫ジョブとして実行します。
- 例7
- ■環境ファイルの内容
#-adsh_conf CHILDJOB_PGM ./test.sh #-adsh_conf CHILDJOB_SHEBANG /bin/ksh #-adsh_conf CHILDJOB_EXT sh
- ■test.shの内容
#!/bin/ksh echo JP1AS
- ■ジョブ定義スクリプトの内容
./test.sh
→条件判定の順序に従い,CHILDJOB_PGMパラメーターを判定します。CHILDJOB_PGMパラメーターの定義に一致するため,読み替えが実施されます。ただし,子孫ジョブとして実行するファイルが指定されていないため,実行エラーになります。
(4) 関数と同名の子孫ジョブまたは外部コマンドの優先順序
関数と同名の子孫ジョブ,または外部コマンドの優先順序を次に示します。
メインスクリプトで関数を定義済み,または#-adsh_script,.(ドット)コマンドによって関数定義ファイルを読み込んでいる場合は,常に関数が優先されます。
関数にオートロード属性が付加されていて,かつシェル変数FPATHに指定されたディレクトリ内に関数と同名の関数定義ファイルが存在する場合は,関数が優先されます。
関数にオートロード属性が付加されていないが,シェル変数FPATHに指定されたディレクトリ内に関数と同名の関数定義ファイルが存在する場合は,次の順に判定します。
環境変数PATHに指定されたディレクトリに関数と同名のジョブ定義スクリプト,または外部コマンドが存在する場合は,子孫ジョブまたは外部コマンドが実行されます。
環境変数PATHに指定されたディレクトリに該当するジョブ定義スクリプト,または外部コマンドが存在しない場合は,関数が実行されます。
環境変数PATHとシェル変数FPATHに指定されたディレクトリのどちらにも該当するファイルが存在しない場合は,実行するコマンドが存在しないためエラー終了します。