シェルスクリプトにおいて標準出力(標準エラー出力)される文字列を変数に代入して取り扱う方法について。
対象とする関数として以下のものを利用。
sayHello(){
sleep 10
echo "hello stdout"
echo "hello stderr" >&2
}
直接変数に代入する
変数messageに出力を代入したければ以下のようにすればよい
message=`sayHello`
echo ${message}
この結果は以下の通り
hello stderr hello stdout
つまり、関数"sayHello"実行時にエラー出力が表示され、
標準出力は変数messageへの代入を経由して出力される。
これではエラー出力結果を別の変数に代入することはできない。
また、関数"sayHello"をバックグラウンドで実行したい時には
標準出力を変数に代入することができない。
ファイルを経由して代入する
標準出力と標準エラー出力の内容をファイルにリダイレクトし、
それぞれのファイルを変数に展開することでこれを解決する。
sayHello > /tmp/message.out.$$ 2>/tmp/message.err.$$
message_out=`cat /tmp/message.out.$$`
message_err=`cat /tmp/message.err.$$`
rm -f /tmp/message.out.$$
rm -f /tmp/message.err.$$
echo ${message_out}
echo ${message_err}
この結果は以下の通り
hello stdout hello stderr
これにより標準出力、標準エラー出力をそれぞれその後の処理で扱える上に
処理をバックグラウンド化するこことにも対応できる。
ただし、この方法だとディスクアクセスを伴う?
これ以上どうにかしたかったら何らかの別のプログラミング言語を
利用しようってことなのかな。