出力を入力へ

プログラミングに関する基本的な事を中心にまとめます

標準出力を変数に代入する方法あれこれ

シェルスクリプトにおいて標準出力(標準エラー出力)される文字列を変数に代入して取り扱う方法について。
対象とする関数として以下のものを利用。

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

これにより標準出力、標準エラー出力をそれぞれその後の処理で扱える上に
処理をバックグラウンド化するこことにも対応できる。

ただし、この方法だとディスクアクセスを伴う?
これ以上どうにかしたかったら何らかの別のプログラミング言語
利用しようってことなのかな。