ページの先頭行へ戻る
Systemwalker Centric Manager API・スクリプトガイド

6.3.7 exec(サブプロセスを起動する)

機能説明

サブプロセスを起動し、プログラムのコマンドを実行します。

記述形式

【Windows版】

exec cmd /c cmdnameargs …

注) execコマンドは、cmd /cと併せて使用してください。

【UNIX版】

exec cmdnameargs …

オプション

cmdname

起動するコマンドファイル名を指定します。Windows上のファイル名の場合は、ディレクトリの区切りを“\”(円記号)のほかに“/”(スラッシュ)で記述することが可能です。円記号を使用する場合は、エスケープ文字に扱われないようファイル名全体を“{ }”(中括弧)で囲む必要があります。

args …

起動するコマンドに渡す引数を指定します。

最後のargsが“&”の場合、コマンドはバックグラウンドで実行されます。コマンドは通常、フォアグラウンドで実行され、execコマンドはcmdnameのプロセス終了を待ちますが、バックグラウンドで実行した場合は、終了を待たずに復帰します。

また、argsにはフロー制御記号を指定することが可能です。

Windowsの場合、ファイルをパス指定で与えるときは、ディレクトリの区切りに“\”(円記号)を使用してファイル名全体を“{ }”(中括弧)で囲む必要があります。

フロー制御

argsに以下のフロー制御記号を記述することで、起動コマンドの標準入出力への操作や複数コマンドを起動しての情報のやりとりが可能となります。

記号・書式

意味

|

パイプライン中の個々のコマンドを区切ります。前のコマンドの標準出力を後のコマンドの標準入力へつなげます。同様にして3つ以上のコマンドをつないでいくことが可能です。
“|”の代わりに“|&”を使用すると標準出力のほかに標準エラー出力も後のコマンドの標準入力につながれます。

【Windows版】
exec cmd /c dir |cmd /c sort

【UNIX版】
exec ls -l | grep root

< filename

cmdnameの標準入力として、filenameで指定したファイルの内容が読み込まれます。(注1)

【Windows版】
exec cmd /c sort < data.txt

【UNIX版】
exec sort < data.txt

<< value

cmdnameの標準入力として、valueで指定した値(文字列)が読み込まれます。(注1)

【Windows版】
exec cmd /c sort << $data

【UNIX版】
exec sort << $data

> filename

cmdnameの標準出力がfilenameで指定したファイルに上書きで書き込まれます。(注1)
“>”の代わりに“>>”を使用すると上書きでなく追加で書き込まれます。

【Windows版】
exec cmd /c dir > data

【UNIX版】
exec ls > data

>& filename

cmdnameの標準出力と標準エラー出力がfilenameで指定したファイルに上書きで書き込まれます。(注1)
“>&”の代わりに“>>&”を使用すると上書きでなく追加で書き込まれます。

【Windows版】
exec cmd /c dir data >& out

【UNIX版】
exec rm -f data >& out

2> filename

cmdnameの標準エラー出力がfilenameで指定したファイルに上書きで書き込まれます。(注2)
“2>”の代わりに“2>>”を使用すると上書きでなく追加で書き込まれます。

【Windows版】
exec cmd /c dir data 2> out

【UNIX版】
exec rm -f data 2> out

注1:cmdnameの部分が“|”により複数のコマンドからなる場合、読み込みは先頭のコマンドが、書き込みは末尾のコマンドがその対象となります。
注2:cmdnameの部分が“|”により複数のコマンドからなる場合、すべてのコマンドの標準エラー出力がfilenameで指定したファイルに格納されます。

復帰値

コマンドがフォアグラウンドで実行されている場合:

cmdnameコマンドの標準出力が返されます。このとき、出力テキストの末尾にある改行コードは削除されます。

フロー制御により複数のコマンドが実行される場合は、末尾のコマンドがその対象となります。

また、フロー制御により標準出力がリダイレクトされている場合は、空文字列を返します。

コマンドがバックグラウンドで実行されている場合:

起動コマンドのプロセスIDが返されます。

フロー制御により複数のコマンドが実行される場合は、全プロセスIDが空白で区切って返されます。

アプリケーションが出力する標準出力を、execコマンドの復帰値として獲得することはできません。

その他入出力情報

標準出力/標準エラー出力情報(errorInfo)について

コマンドの標準出力/標準エラー出力がリダイレクトされていない場合、グローバル変数errorInfoの先頭にその出力文字列が格納されます。errorInfoには、exec文自身の実行エラーを示す文字列も格納されます。

例:

【Windows版】

以下の仕様のアプリケーション(c:\usr\bin\appl001.exe)がエラー終了した場合

仕様:指定された日付のデータを標準出力に書き込む。
      日付の指定が不当な場合は以下のメッセージを標準エラー出力に出力する。
    “日付の指定に誤りがあります。yyyymmdd で指定してください。”
if {[catch {
          exec cmd /c {c:\usr\bin\appl001.exe} 010520
    }]} {
      puts "エラー情報 START"
      puts $errorInfo
      puts "エラー情報 END"
}

上記を実行すると、標準出力には以下のように表示されます。

エラー情報START
日付の指定に誤りがあります。yyyymmddで指定してください。←appl001コマンドの出力
    while executing                            ← exec文自身の実行エラーを
"exec cmd /c {c:\usr\bin\appl001.exe} 010520"          ←        示す文字列
エラー情報END

【UNIX版】

存在しないファイル(/tmp/data)を指定し、lsコマンドを実行する場合

if {[catch {
          exec ls /tmp/data
    }]} {
      puts "エラー情報 START"
      puts $errorInfo
      puts "エラー情報 END"
}

上記を実行すると、標準出力には以下のように表示されます。

エラー情報 START
/tmp/data: ファイルもディレクトリもありません。  ← lsコマンドの出力
    while executing                             ← exec文自身の実行エラーを
"exec ls /tmp/data"                              ←                示す文字列
エラー情報 END

終了コード(errorCode)について

コマンドの終了コードが“0”以外の場合は、グローバル変数errorCodeに以下の書式で終了コードが格納されています。また、その他の詳細情報も格納されます。 errorCodeの書式については、“catch(スクリプト行を実行し処理例外をトラップする)”の復帰値を参照してください。

CHILDSTATUS pid exitcode

pid

【Windows版】

ここに入る数字は意味を持ちません。

【UNIX版】

プロセスID

exitcode

プロセスの終了コード

参照

catch(スクリプト行を実行し処例外をトラップする)

注意事項

一般的なコマンドのパラメタ解釈例

コマンドラインの記述

コマンド内での解釈

"abc"

abc

\"abc\"

"abc"

特殊なコマンドは、コマンドラインの記述をそのまま解釈します。

特別な文字を解釈しないコマンドを実行させる場合は、コマンドを実行するバッチファイルを作成し、そのバッチファイルをexecで実行するように記述してください。

使用例

【Windows版】

dirコマンドを実行し、コマンドの標準出力/標準エラー出力をすべてスクリプトの標準出力へ出力させます。

if {[catch {
          set outmsg [exec cmd /c dir {c:\tmp\data}]

          # dirの標準出力(exec戻り値)をスクリプトの標準出力へ
          puts stdout $outmsg
      }]} {
    # 処理例外発生
    # outmsgには初期値として$errorInfoを格納しておきます。
    set outmsg $errorInfo

    # dirの出力情報(errorInfoの末尾2行を除いたもの)をスクリプトの標準出力へ
    regexp {(.*)\n.*\n.*} $errorInfo all outmsg
    puts stdout $outmsg
}

【UNIX版】

lsコマンドを実行し、コマンドの標準出力/標準エラー出力をすべてスクリプトの標準出力へ出力させます。

if {[catch {
          set outmsg [exec ls -l /tmp/data]

          # lsの標準出力(exec戻り値)をスクリプトの標準出力へ
          puts stdout $outmsg
      }]} {
    # 処理例外発生
    # outmsgには初期値として$errorInfoを格納しておきます。
    set outmsg $errorInfo

    # lsの出力情報(errorInfoの末尾2行を除いたもの)をスクリプトの標準出力へ
    regexp {(.*)\n.*\n.*} $errorInfo all outmsg
    puts stdout $outmsg
}

実行結果/出力形式

標準出力には、以下のように表示されます。

【Windows版】

【UNIX版】