Systemwalker Operation Manager リファレンスマニュアル - UNIX共通 -
目次 索引 前ページ次ページ

第9章 Systemwalkerスクリプト> 9.2 Systemwalkerスクリプトで使用するコマンド・制御文

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

◆機能説明

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

◆記述形式

exec cmdnameargs …

◆オプション

cmdname
起動するコマンドファイル名を指定します。
args …
起動するコマンドに渡す引数を指定します。

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

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

フロー制御

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

記号・書式

意味

|

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

exec ls -l | grep root

< filename

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

exec sort < data.txt

<< value

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

exec sort << $data

> filename

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

exec ls > data

>& filename

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

exec rm -f data >& out

2> filename

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

exec rm -f data 2> out

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

◆復帰値

コマンドがフォアグラウンドで実行されている場合:
cmdnameコマンドの標準出力が返されます。このとき、出力テキストの末尾にある改行コードは削除されます。

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

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

コマンドがバックグラウンドで実行されている場合:
起動コマンドのプロセスIDが返されます。

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

◆注意事項

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

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

例:

存在しないファイル(/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に以下の書式で終了コードが格納されています。

CHILDSTATUS pid exitcode

pid
プロセスID
exitcode
プロセスの終了コード

◆使用例

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
}

◆実行結果/出力形式

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

-rw-rw-r--  1 root   other    0 9月 25日 15:05 /tmp/data


/tmp/data: ファイルもディレクトリもありません。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright (C) 富士通株式会社 1995-2005