Jul 27, 2012
シェルスクリプトで便利な小技
シェルスクリプトを作成するときに知っておくと便利な小技集。
- exec > ファイル
-
以降の標準出力を全て ファイル に出力するので
この設定をしておくと簡単な実行ログが取得出来る。
同様に exec 2> ファイル とすると 標準エラー出力が全て ファイル に出力されるので エラーログが取得できる。
当然 exec > ファイル 2>&1 とすれば 標準出力も標準エラー出力も取得できる。
ファイル に /dev/null を指定すれば スクリプト実行中の出力は全て抑止されるので、 cron (8) から実行される場合などでは便利な場合もある。
1#!/bin/sh 2 3exec 2> ${TMP:-/tmp}/myname.log 4 :
- set -e
-
スクリプト実行時に制御文以外でエラーが発生した場合に
スクリプトを終了させる。
スクリプト中で実行すべきコマンドを typo した場合などで、 以降の処理が実行されると困る場合などに特に役立つ。
1#!/bin/sh 2 : 3echo "call myfunc ..." 4mtfunc # 関数名を typo している 5echo "end myfunc ..." 6 :
この様なコードの場合 set -e されていると、 mtfunc がエラーになった時点でスクリプトが エラー終了するので以降の処理が実行されない。
当然 if、while 、&&、 || などでコマンドの結果が評価される場合は エラーにはならない。 - set -u
-
スクリプト中で値が設定されていない変数を参照した場合に
エラーメッセージを表示してスクリプトを終了させる。
シェル変数や環境変数を typo した場合など、 変数に値が設定されていない事で発生する問題が回避できる。
1#!/bin/sh 2tempdir=/var/tmp/ 3mynam=myname 4 : 5rm -rf ${tmpdir}/${myname} # 変数名を typo している 6 :
この様なコードの場合、 変数名 ${tempdir} と ${mynam} を それぞれ typo しているので、 結果として rm -rf / に展開されてしまうが、 set -u されていると実行が防げる。 - set -n
- こちらはどちらかと言うとスクリプトの開発時に有効な設定で、 コマンドは実行されないのでスクリプトの文法チェックに最適。
- set -x
-
こちらも開発時に有効な設定で、
コマンドが実行される前にコマンドを stderr に出力する。
上の exec と組み合わせると 詳細な実行ログが取得できるのでデバッグに便利1#!/bin/sh 2 3exec 2> ${TMP:-/tmp}/debug.log 4set -x 5 :
Edit this entry...
wikieditish message: Ready to edit this entry.
A quick preview will be rendered here when you click "Preview" button.