bashは、グローバル関連の読み取り専用配列を(再)宣言すると自動的に関数を返します。

bashは、グローバル関連の読み取り専用配列を(再)宣言すると自動的に関数を返します。

明らかに、より複雑で意味のあるスクリプトが削除されました。

#!/bin/bash

function InitializeConfig(){
    declare -r -g -A SHCFG_INIT=( [a]=b )
    declare -r -g -A SHCFG_INIT=( [c]=d )
    echo "This statement never gets executed"
}

set -o xtrace

InitializeConfig
echo "Back from function"

出力は次のとおりです。

ronburk@ubuntu:~/ubucfg$ bash bug.sh
+ InitializeConfig
+ SHCFG_INIT=([a]=b)
+ declare -r -g -A SHCFG_INIT
+ SHCFG_INIT=([c]=d)
+ echo 'Back from function'
Back from function

Bashは、2番目のステートメントでreturn関数を自動的に実行するようですdeclare。これが実際に新しいエラーだと考え始めましたが、そうでない場合を知りたいです。

他の細部:

Machine: x86_64
OS: linux-gnu
Compiler: gcc
Compilation CFLAGS:  -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64' -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='x86_64-pc-linux-gn$
uname output: Linux ubuntu 3.16.0-38-generic #52~14.04.1-Ubuntu SMP Fri May 8 09:43:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Lin$
Machine Type: x86_64-pc-linux-gnu

Bash Version: 4.3
Patch Level: 11
Release Status: release

答え1

私が見つけたこのスレッドは[Eメール保護]関連配列に関連付けられていますtest -v。簡単に言えば、bashはtest -v SHCFG_INIT[0]スクリプトでこれを暗黙的に実行します。この動作が4.3で導入されたかどうかはわかりません。

declare -pこの問題を解決するためにこれを使用したいかもしれません...

if ! declare -p SHCFG_INIT >/dev/null 2>&1; then
    echo "looks like SHCFG_INIT not defined"

関連情報