※当サイトの記事には、広告・プロモーションが含まれます。

シェルスクリプトで「循環名前参照(circular name reference)」という事象が存在するらしい

www.itmedia.co.jp

 賃貸物件の仲介では、貸主や不動産管理会社からの依頼を受けた複数の不動産仲介会社がWebサイトや雑誌に募集広告を掲載するのが一般的。しかし注目度が高い物件を募集終了後も残し、問い合わせてきた客に別の物件を紹介する、いわゆる「おとり物件」が問題視されている。

住宅情報サイトの「おとり物件」9割検知 ライフルが自社開発AIで - ITmedia NEWS

⇧「おとり物件」のような問題って住宅情報に限らないと思いますけど、「終了ステータス」とか表示して「物件」の状態が分かるようにしておいて欲しいですね。

シェルスクリプトで「循環名前参照(circular name reference)」という事象が存在するらしい

シェルスクリプトの関数内で定義した配列を、2つの関数で呼ぶようにしてみたところ、

⇧ という感じで、『warning: '': circular name reference』というエラーが出るという...

stackoverflow.com

qiita.com

⇧ 上記サイト様によりますと、「循環名前参照(circular name reference)」という既知の問題らしく、ある一定の条件で変数名が重複すると起こる事象らしい。

というのも、前回、

ts0818.hatenablog.com

⇧ 関数の外側で定義した変数を、2つの関数で同じ変数名で参照していたのだけど、「循環名前参照(circular name reference)」は起きなかったのよね...

で、今回、「循環名前参照(circular name reference)」が起きたのが以下。

■/home/ts0818/work/test_arr/test_ref.sh

#!/bin/bash

function test_ref_arr() {
  declare -n ref_arr="$1"
  echo ${ref_arr[@]}
  #declare -n ref_ref_arr="$1"
  #echo ${ref_ref_arr[@]}
}

function test_arg() {
  declare -n ref_arr="$1"
  test_ref_arr ref_arr
}

function test_ref() {
  declare -a alphabet_arr=("A" "B" "C")
  test_arg alphabet_arr
}

■/home/ts0818/work/test_arr/execute_test_ref.sh

#!/bin/bash

source ./test_ref.sh

test_ref

⇧ といった感じ。

ちなみに、以下のように、異なる変数名にしたところエラーは出なくなる。

■/home/ts0818/work/test_arr/test_ref.sh

#!/bin/bash

function test_ref_arr() {
  #declare -n ref_arr="$1"
  #echo ${ref_arr[@]}
  declare -n ref_ref_arr="$1"
  echo ${ref_ref_arr[@]}
}

function test_arg() {
  declare -n ref_arr="$1"
  test_ref_arr ref_arr
}

function test_ref() {
  declare -a alphabet_arr=("A" "B" "C")
  test_arg alphabet_arr
}

■/home/ts0818/work/test_arr/execute_test_ref.sh

#!/bin/bash

source ./test_ref.sh

test_ref

名前は重複していても良いけど、同じ名前の変数を同じ名前の変数で受け取るのが駄目ってことなんかね?

まぁ、declare -n で別件のエラーが出ていて、関数内で定義した配列を別の関数で呼んでるからエラーになるのか調査していたら、今回の「循環名前参照(circular name reference)」の問題を発見したというね...

関数内で定義した配列は普通に別の関数内で参照できるってことか、だとすると、別件のエラーの原因が分からんな...

シェルスクリプト、本当に挙動が意味不明過ぎる...

毎度モヤモヤ感が半端ない...

今回はこのへんで。