メモの日々


2015年03月05日(木) [長年日記]

[shell] bashのset -eがローカル変数への代入で効かない

bashスクリプトについてメモ。先に前置き。

で、

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 にアクセスできません: そのようなファイルやディレクトリはありません