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 にアクセスできません: そのようなファイルやディレクトリはありません
[ツッコミを入れる]