7.3.40 PIPE_CMD_LASTパラメーター(パイプの最終コマンドの実行プロセスを定義する)
形式
- UNIX版
-
#-adsh_conf PIPE_CMD_LAST {CURRENT|OTHER}
- Windows版
-
#-adsh_conf PIPE_CMD_LAST {CURRENT|OTHER|SEQUENTIAL}
機能
パイプラインの最終コマンドをカレントプロセスで実行するかどうかを定義します。
次のようにパイプラインの最終コマンドで変数の内容を更新し,パイプライン以降のコマンドで更新した内容を使用する場合は,CURRENTを指定してください。
- ジョブ定義スクリプトの内容
typeset -i CNT=0 cat INFILE | while read STR do echo "$STR" let CNT=CNT+1 done echo "Line count is $CNT."
この結果,while文終了後のシェル変数CNTには,readコマンドで読み込まれた行数(INFILEの行数)が格納されます。
一方,次のようにパイプラインの最終コマンドで変数の内容を更新するが,パイプライン実行前の変数の内容で,パイプライン終了後に再度利用したい場合はOTHERを指定してください(CBL_SYSUT1,CBL_SYSUT2はCBLUAPxの共通インターフェース用変数と仮定します)。
- ジョブ定義スクリプトの内容
CBL_SYSUT1=/file1 CBL_SYSUT2=/file2 CBLUAP1 cat INFILE | while read DIR do CBL_SYSUT1=`cmd1 y` CBL_SYSUT2=`cmd2 y` CBLUAP2 done CBLUAP3
この場合,while文終了後のシェル変数CBL_SYSUT1には"/file1",CBL_SYSUT2には"/file2"が格納されています。
このパラメーターは同一の環境ファイル内で複数回指定することはできません。複数回指定した場合は,エラーメッセージが出力されてジョブは終了します。
オペランド
- CURRENT
パイプラインの全コマンドを非同期実行します。パイプラインの最終コマンドが次に示すコマンドの場合,カレントプロセスで動作します。
シェル標準コマンド
代入式
スクリプト制御文
-
シェル拡張コマンド
-
スクリプト予約語コマンド
-
関数
パイプラインの最終コマンドが上記以外の場合,別プロセスで動作します。
- OTHER
パイプラインの全コマンドを非同期実行します。パイプラインの最終コマンドは別プロセスで動作します。
- SEQUENTIAL【Windows限定】
-
パイプラインの全コマンドをカレントプロセスで逐次実行します。また,コマンド間のデータの受け渡しに一時ファイルを使用します。
これはAdvanced Shell 11-00より前のWindows版と同様の動作です。
注意事項
システム環境ファイルとジョブ環境ファイルの両方にこのパラメーターが定義されていた場合,ジョブ環境ファイルでの定義が有効になります。
-
Windows版で,OTHERまたはCURRENTを指定した場合,SEQUENTIALに比べて実行時間が長くなる場合があります。そのため,SEQUENTIALからOTHERまたはCURRENTに切り替える際は,ジョブの実行時間を検証してください。
使用例
次に示す入力ファイルとジョブ定義スクリプトを使って,PIPE_CMD_LASTパラメーターを指定した場合の実行結果の違いを示します。
例1
ジョブ定義スクリプトの内容
STR="abcdefg" echo "ABCDEFG" | read STR echo $STR
標準出力への出力結果(PIPE_CMD_LASTパラメーターにCURRENTまたはSEQUENTIALを指定した場合)
ABCDEFG
標準出力への出力結果(PIPE_CMD_LASTパラメーターにOTHERを指定した場合)
abcdefg
例2
ジョブ定義スクリプトの内容
A=1 echo "Hello World" | A=10 echo $A
標準出力への出力結果(PIPE_CMD_LASTパラメーターにCURRENTまたはSEQUENTIALを指定した場合)
10
標準出力への出力結果(PIPE_CMD_LASTパラメーターにOTHERを指定した場合)
1
例3
入力ファイル「INFILE」の内容
user1,500,Tomato user2,1000,Tomato user3,300,Lettuce user1,450,Cabbage user1,250,Orange
ジョブ定義スクリプトの内容
typeset -i cnt=1 cat INFILE | grep user1 | while read NAME do if [ $cnt -ge 3 ]; then break fi echo "$cnt = $NAME" let cnt=cnt+1 done echo $cnt
whileからdoneまではパイプの最終コマンドとして扱われます。
標準出力への出力結果(PIPE_CMD_LASTパラメーターにCURRENTまたはSEQUENTIALを指定した場合)
1 = user1,500,Tomato 2 = user1,450,Cabbage 3
標準出力への出力結果(PIPE_CMD_LASTパラメーターにOTHERを指定した場合)
1 = user1,500,Tomato 2 = user1,450,Cabbage 1