LoginSignup
65
75

More than 5 years have passed since last update.

シェルスクリプトで便利な小技

Last updated at Posted at 2013-03-01

こちらも自分の blog からの転載

シェルスクリプトを作成する時に知っておくと便利な小技たち

  • exec > ファイル

以降の標準出力を全て ファイル に出力するので この設定をしておくと簡単な実行ログが取得出来る。
同様に exec 2> ファイル とすると 標準エラー出力が全て ファイル に出力されるので エラーログが取得できる。
当然 exec > ファイル 2>&1 とすれば 標準出力も標準エラー出力も取得できる。
ファイル に /dev/null を指定すれば スクリプト実行中の出力は全て抑止されるので、cron (8) から実行される場合などでは便利な場合もある。

samble
#!/bin/sh

exec 2> ${TMP:-/tmp}/myname.log

  • set -e

スクリプト実行時に制御文以外でエラーが発生した場合に スクリプトを終了させる。
スクリプト中で実行すべきコマンドを typo した場合などで、 以降の処理が実行されると困る場合などに特に役立つ。

sample
#!/bin/sh

echo "call myfunc ..."
mtfunc                                          # 関数名を typo している
echo "end myfunc ..."

この様なコードの場合 set -e されていると、 mtfunc がエラーになった時点でスクリプトが エラー終了するので以降の処理が実行されない。
当然 ifwhile&&|| などでコマンドの結果が評価される場合は エラーにはならない。

  • set -u

スクリプト中で値が設定されていない変数を参照した場合に エラーメッセージを表示してスクリプトを終了させる。
シェル変数や環境変数を typo した場合など、 変数に値が設定されていない事で発生する問題が回避できる。

sample
#!/bin/sh
tempdir=/var/tmp/
mynam=myname

rm -rf ${tmpdir}/${myname}                      # 変数名を typo している

この様なコードの場合、 変数名 ${tempdir}${mynam} を それぞれ typo しているので、 結果として rm -rf / に展開されてしまうが、 set -u されていると実行が防げる。

  • set -n

こちらはどちらかと言うとスクリプトの開発時に有効な設定で、 コマンドは実行されないのでスクリプトの文法チェックに最適。

  • set -x

こちらも開発時に有効な設定で、 コマンドが実行される前にコマンドを stderr に出力する。
上の exec と組み合わせると 詳細な実行ログが取得できるのでデバッグに便利

sample
#!/bin/sh

exec 2> ${TMP:-/tmp}/debug.log
set -x

65
75
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
65
75