2015年03月05日(木) [長年日記]
■ [shell] bashのset -eがローカル変数への代入で効かない
bashスクリプトについてメモ。先に前置き。
- 組み込みコマンドsetを使うとエラー発生時にスクリプトが終了するようにできる。
- 関数内で組み込みコマンドlocalを使うとローカル変数を作れる。
で、
a=`command`
のように代入するとcommandがエラーになった時にそこでスクリプトが終了するが、
local a=`command`
のように代入するとcommandがエラーになってもスクリプトが終了しないということを知った。後者は、commandがエラーになってもlocalは成功して終了ステータスが0になってしまうのだと思う。対処は
local a a=`command`
のように書くこと。実験スクリプトと出力結果をメモ。
#!/bin/bash set -e function f() { local a=`ls fff` echo "f: $a $?" } function g() { local a a=`ls ggg` echo "g: $a $?" } f g
ls: fff にアクセスできません: そのようなファイルやディレクトリはありません f: 0 ls: ggg にアクセスできません: そのようなファイルやディレクトリはありません