綾小路龍之介の素人思考

[dash] シェルスクリプトの local を C 言語的なローカル変数として考えるとちょっとまずい

local 属性をつけられた変数を、その変数が宣言されたブロックと同じブロックの中で呼び出された関数で、参照できる。

つまり以下である。main の中で local 属性付きの _main_local という変数を作ったが、この変数が main から呼び出された func1 の中で参照できてしまう。

$ cat --number test.sh
     1  #!/bin/dash
     2  set -eux;
     3
     4  func0 () {
     5          local _func0_local='func0 local';
     6  }
     7
     8  func1 () {
     9          echo "${_main_local}"
    10          echo "${_func0_local}"
    11  }
    12
    13  main () {
    14          local _main_local='main local';
    15          func0;
    16          func1;
    17  }
    18
    19  main;
    20
    21  exit 0;
$ sh test.sh
+ main
+ local _main_local=main local
+ func0
+ local _func0_local=func0 local
+ func1
+ echo main local
main local
test.sh: 10: test.sh: _func0_local: parameter not set

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2010-10-03T22:57:42+09:00
  2. Modified: 2010-10-03T22:57:42+09:00
  3. Generated: 2018-09-20T23:09:21+09:00