PATH_CONV_RULEパラメーター(パス変換ルールを定義する)【Windows限定】
形式
#-adsh_conf PATH_CONV_RULE {1|2}
機能
パス変換ルールを選択します。PATH_CONVパラメーターまたは#-adsh_path_varコマンドでパス変換が定義されている場合に有効です。指定を省略した場合はパス変換ルール1が設定されます。
また,PATH_CONV_ENABLEパラメーターでパス区切り文字が定義されている場合,区切られた範囲が変換対象となります。PATH_CONV_ENABLEパラメーターで定義された区切り文字は,ジョブ定義スクリプトを実行したOSで使用される区切り文字へ変換されます。
オペランド
- 1
-
パス変換ルール1を選択します。
「"(ダブルクォーテーション)」で囲まれた範囲だけが変換対象となります。
- 2
-
パス変換ルール2を選択します。
項目「パス変換ルール2で使用する区切り文字」に示す区切り文字で区切られた文字列が変換対象となります。ここで区切られた文字列は,パス区切り文字(PATH_CONV_ENABLEパラメーターで定義)でさらに区切られてから変換されます。ただし,' '内と${ }内の文字は変換されません。
変換個所が「"(ダブルクォーテーション)」で囲まれていない場合,変換結果が「"(ダブルクォーテーション)」で囲まれます。それに加えて次に示す範囲も「"(ダブルクォーテーション)」で囲まれます。
-
パス区切り文字
「";"」に変換されます。
-
「$シェル変数名」
#-adsh_path_varコマンドで指定していないシェル変数も含みます。
「$」の後ろから,英数字(先頭文字の場合は英字)と「_(アンダースコア)」のどちらでもない文字が現れるまでの範囲をシェル変数名と見なします。シェル変数名がない場合は「$」だけを「"(ダブルクォーテーション)」で囲むことはしません。
-
「${」から「}」までの範囲
#-adsh_path_varコマンドで指定していないシェル変数も含みます。
-
パス変換ルール2で使用する区切り文字
パス変換ルール2で使用する区切り文字と,区切り文字が有効/無効となる位置を次に示します。
区切り文字 |
区切り文字の位置 |
||||||
---|---|---|---|---|---|---|---|
' '内 |
" "内※1 |
` `内※1 |
\直後の1文字 |
$( )内※1 |
${ }内※1 |
その他 |
|
| |
× |
× |
○ |
× |
○ |
※2 |
○ |
& |
× |
× |
○ |
× |
○ |
※2 |
○ |
; |
× |
× |
○ |
× |
○ |
※2 |
○ |
< |
× |
× |
○ |
× |
○ |
※2 |
○ |
> |
× |
× |
○ |
× |
○ |
※2 |
○ |
( |
× |
※3 |
○ |
× |
○ |
※2 |
○ |
) |
× |
× |
○ |
× |
○ |
※2 |
○ |
` |
× |
○ |
○ |
× |
○ |
※2 |
○ |
' |
○ |
× |
○ |
× |
○ |
※2 |
○ |
" |
× |
○ |
○ |
× |
○ |
※2 |
○ |
# |
× |
× |
○ |
× |
○ |
※2 |
○ |
= |
× |
× |
○ |
× |
○ |
※2 |
○ |
スペース(タブ記号を含む) |
× |
× |
○ |
× |
○ |
※2 |
○ |
改行コード |
× |
× |
○ |
× |
○ |
※2 |
○ |
範囲 |
入れ子とする範囲 |
|||||
---|---|---|---|---|---|---|
' ' |
" " |
` ` |
\直後の1文字 |
$( ) |
${ } |
|
" "内 |
× |
× |
○ |
○ |
○ |
○ |
` `内 |
○ |
○ |
× |
○ |
○ |
○ |
$( )内 |
○ |
○ |
○ |
○ |
○ |
○ |
${ }内 |
○ |
○ |
○ |
○ |
○ |
○ |
注意事項
-
システム環境ファイルとジョブ環境ファイルの両方にこのパラメーターが定義されていた場合,ジョブ環境ファイルでの定義が有効になります。
-
パス変換ルール2を選択すると,パス変換ルール1よりも変換範囲が広いため,期待どおりの変換結果が得られない場合があります。ジョブ定義スクリプトを実行する前に構文チェック機能を使用し,生成されたスクリプトイメージでパスの変換結果を確認してください。変換結果が適切でない場合は,パス変換ルールを変更するか,ジョブ定義スクリプトを変更して再実行してください。
-
パス変換ルール2を選択すると,変数置換の変数やパターンは変換対象となりません。例を次に示します。
環境設定パラメーター
#-adsh_conf PATH_CONV_ENABLE / : #-adsh_conf PATH_CONV_RULE 2 #-adsh_conf PATH_CONV /tmp d:\\temp
変換前のジョブ定義スクリプト
#-adsh_path_var DIR AA=${DIR:-/tmp}
変換後のジョブ定義スクリプト
#-adsh_path_var DIR AA="${DIR:-/tmp}"
この例では#-adsh_path_varコマンドで変数が定義されているため,${変数名}の部分が「"(ダブルクォーテーション)」で囲まれていますが,/tmpは変換されていません。これを回避するには次のように/tmpを変数として指定するなど,ジョブ定義スクリプトを変更してください。
#-adsh_path_var DIR BB=/tmp AA=${DIR:-$BB}
-
パス変換ルール2では文字列置換として変換されます。そのため,同じパスを指していても指定文字列が異なれば同じ変換結果にならないことがあります。
-
パス変換ルール2ではヒアドキュメントのドキュメント部分も変換されるため,プログラムが処理できないデータへ変換されないよう注意してください。対応方法を次に示します。
-
変換規則を工夫する
-
変数置換を利用して変換されないようにする
これらの方法で対応できない場合は,パス変換ルール1へ変更するか,ヒアドキュメントの外部ファイル化を検討してください。
ヒアドキュメントの変換例を次に示します。
環境設定パラメーター
#-adsh_conf PATH_CONV_ENABLE / : #-adsh_conf PATH_CONV_RULE 2 #-adsh_conf PATH_CONV /home/user001 d:\\home\\user001
変換前のジョブ定義スクリプト
uap << EOF IN=/home/user001/infile FTP=/home/user001/ftp/outfile EOF
変換後のジョブ定義スクリプト
uap << EOF IN="d:\\home\\user001"\\infile FTP="d:\\home\\user001"\\ftp\\outfile EOF
これによって,ヒアドキュメント内のデータは次のように変換されます。
IN="d:\\home\\user001"\\infile FTP="d:\\home\\user001"\\ftp\\outfile
変換後のパスにはダブルクォーテーションが付加されているため,ユーザープログラムがダブルクォーテーションを適切に処理できなければ,ユーザープログラムは正しく動作しません。また,ftpコマンドでリモートサイトのパスを指定する場合など,パス名を変換したくないことがあります。この場合,パス名部分を変数に置き換えてヒアドキュメント外に出すなどの変更をしてください。
例えば,IN=/home/user001/infileのパスは変換したいが,FTP=/home/user001/ftp/outfileのパスを変換したくない場合は,次のように変更することで対応できます。
VARIN=/home/user001/infile VARFTP='/home/user001/ftp/outfile' uap << EOF IN=$VARIN FTP=$VARFTP EOF
-
-
次の文字はパス変換ルールに合致すると変換されるため,注意してください。
-
演算子
-
/で始まるコマンドのオプション文字
-
コマンドの引数に指定された,パス名でないディレクトリ区切り文字を含んだデータ
-
三項演算子
三項演算子が変換された例を次に示します。
環境設定パラメーター
#-adsh_conf PATH_CONV_ENABLE / : #-adsh_conf PATH_CONV_RULE 2 #-adsh_conf PATH_CONV A2/A1 A2\\A1
変換前のジョブ定義スクリプト
#-adsh_job JOB001 A1=10 A2=5 ((BB=A1>A2?A1/A2:A2/A1))
変換後のジョブ定義スクリプト
#-adsh_job JOB001 A1=10 A2=5 ((BB=A1>A2?A1\\A2";""A2\\A1"))
この例では,((BB=A1>A2?A1/A2:A2/A1))の最後のA2/A1が変換ルールに一致して変換されています。これを防ぐには,次のどちらかの方法でジョブ定義スクリプトを変更してください。
・変数を「$シェル変数名」の形式で指定する。
((BB=$A1>$A2?$A1/$A2:$A2/$A1))
・if文で記述し直す。
if((A1>A2)) then ((BB=$A1/$A2)) else ((BB=$A2/$A1)) fi
-
-
パス変換ルール2では,変換規則に一致した文字列に${配列名[*]}形式の配列名が含まれる場合,ダブルクォーテーションで囲まれます。また,変換結果である"${配列名[*]}"は,各要素がIFSシェル変数の値で区切られるため,変換前と結果が異なる場合があるので注意してください。
-
パス変換ルール2では,「cd work」のようにディレクトリ区切り文字が含まれないパスは変換できません。この場合は,ジョブ定義スクリプトの記述を変更するか,ディレクトリ名を変更する変換は指定しないでください。
-
パス変換ルール2では,「コマンド -p パス名」など,オプションの値としてパス名を指定するような場合,オプション文字とパス名の間はスペースで区切ってください。
-
パス変換ルール2では,逆引用符形式のコマンド置換でコマンドに含まれるパスを変換しても,期待どおりの動作となりません。例を次に示します。
環境設定パラメーター
#-adsh_conf PATH_CONV_ENABLE / : #-adsh_conf PATH_CONV_RULE 2 #-adsh_conf PATH_CONV /home/user001 d:\\home\\user001
変換前のジョブ定義スクリプト
cat file | grep `cat /home/user001/text`
変換後のジョブ定義スクリプト
cat file | grep `cat "d:\\home\\user001"\\text`
この例では,コマンド置換のコマンドで使用する\はメタキャラクタとして処理されるため,最終的には\\が消去され,期待どおりの動作となりません。
この場合,次のように$()形式のコマンド置換に変更してください。
cat file | grep $(cat /home/user001/text)
-
パス変換ルール2で,/dev/nullをWindowsのNULデバイスに変更したい場合は,COMMAND_CONV_ARGパラメーターとPATH_CONV_ACCESSパラメーターを使用してください。
-
パス変換ルール2で,パスを次のように記述した場合,正しく変換できません。
環境設定パラメーター
#-adsh_conf PATH_CONV_ENABLE / : #-adsh_conf PATH_CONV_RULE 2
変換前のスクリプト例
#-adsh_path_var homedir INPUT1=${homedir}"/test/data" INPUT2="${homedir}"/test/data
パス変換は区切り文字で区切られた文字列単位に実施されるため,${homedir}/test/dataがパス名であったとしても,ダブルクォーテーションによって${homedir}と/test/dataの2つの文字列として別々に変換処理されます。そのため,次のような変換結果を期待しても期待どおりの変換とはなりません。
期待する変換結果
#-adsh_path_var homedir INPUT1="${homedir}""\\test\\data" INPUT2="${homedir}"\\test\\data
実際の変換結果
#-adsh_path_var homedir INPUT1="${homedir}""/test/data" INPUT2="${homedir}"/test/data
この場合は次のように記述を変更してください。
#-adsh_path_var homedir INPUT1="${homedir}/test/data" INPUT2="${homedir}/test/data"
使用例
パラメーターの設定例を次に示します。ジョブ定義スクリプトの変換例は,「2.6.2 パス名を変換する」を参照してください。
-
パス変換ルール1でパスを変換します。
#-adsh_conf PATH_CONV_ENABLE / : #-adsh_conf PATH_CONV_RULE 1 #-adsh_conf PATH_CONV /home/user001 d:\\home\\user001
-
パス変換ルール2でパスを変換します。
#-adsh_conf PATH_CONV_ENABLE / : #-adsh_conf PATH_CONV_RULE 2 #-adsh_conf PATH_CONV /home/user01 d:\\home\\user01 #-adsh_conf PATH_CONV BB/AA BB\\AA