Systemwalker Operation Manager リファレンスマニュアル - UNIX共通 - |
目次
索引
![]() ![]() |
第9章 Systemwalkerスクリプト | > 9.2 Systemwalkerスクリプトで使用するコマンド・制御文 |
サブプロセスを起動し、プログラムのコマンドを実行します。
exec 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) |
exec rm -f data 2> out |
注1:cmdnameの部分が“|”により複数のコマンドからなる場合、読み込みは 先頭のコマンドが、書き込みは末尾のコマンドがその対象となります。 注2:cmdnameの部分が“|”により複数のコマンドからなる場合、 すべてのコマンドの標準エラー出力がfilenameで指定したファイル に格納されます。
フロー制御により複数のコマンドが実行される場合は、末尾のコマンドがその対象となります。
また、フロー制御により標準出力がリダイレクトされている場合は、空文字列を返します。
フロー制御により複数のコマンドが実行される場合は、全プロセスIDが空白で区切って返されます。
#アプリケーションを起動します。標準出力を変数“outmsg”に格納します。 |
注) catchによる処理例外設定がないため、execで起動したコ マンドが、 “0”以外の終了コードで終了したり、異常終 了した場合に以下の問題が発生します。
・ジョブの終了コードは“1”となり、実行コマンドの 終了コードが採用されない。
・実行コマンドが標準エラー出力に出力したエラーメッ セージ等を獲得することができない。
これらを回避するために、コマンドを起動する際には catchコマンドによる処理例外のトラップをすることを推 奨します。
標準出力/標準エラー出力情報(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
- プロセスの終了コード
実行コマンドのリダイレクトされていない入出力は以下のとおりに扱われます。
入出力 |
フォアグランド実行 |
バックグランド実行 |
標準入力 |
スクリプトプロセス自身の標準入力から読み込まれる。 | |
標準出力 |
通常は、execコマンドの戻り値となる。 |
スクリプトプロセス自身の標準出力に書き込まれる。 |
標準エラー出力 |
execコマンドの処理例外として扱われ、catchでトラップした場合にはerrorInfoに格納される。 |
スクリプトプロセス自身の標準エラー出力に書き込まれる。 |
execで起動するコマンドに渡す引数の最後に“&”を記述するとバックグラウンドでコマンドが起動されます。この場合、コマンドの実行の終了を待たずに、スクリプトの処理は進行するため、注意が必要です。
また、バックグラウンドで起動した場合、execコマンドの復帰値は実行コマンドのプロセスIDとなります。アプリケーションが出力する標準出力をexecコマンドの復帰値として獲得することはできません。
lsコマンドを実行し、コマンドの標準出力/標準エラー出力をすべてスクリプトの標準出力へ出力させます。
if {[catch { |
標準出力には、以下のように表示されます。
-rw-rw-r-- 1 root other 0 9月 25日 15:05 /tmp/data |
/tmp/data: ファイルもディレクトリもありません。 |
目次
索引
![]() ![]() |