Bash 배열 역참조로 인해 잘못된 패키지 이름

Bash 배열 역참조로 인해 잘못된 패키지 이름

소스에서 Emacs를 빌드하려고 합니다. 구성 옵션을 나열할 때 Emacs 배열이 제대로 구성되지 않았습니다. 선택적 옵션을 추가하기 위해 Bash 배열을 추가하면 구성이 중단됩니다. 다음은 손상된 배열입니다.

BUILD_OPTS=('--with-xml2' '--without-x' '--without-sound' '--without-xpm'
    '--without-jpeg' '--without-tiff' '--without-gif' '--without-png'
    '--without-rsvg' '--without-imagemagick' '--without-xft' '--without-libotf'
    '--without-m17n-flt' '--without-xaw3d' '--without-toolkit-scroll-bars' 
    '--without-gpm' '--without-dbus' '--without-gconf' '--without-gsettings'
    '--without-makeinfo' '--without-compress-install')

if [[ ! -e "/usr/include/selinux/context.h" ]] &&
   [[ ! -e "/usr/local/include/selinux/context.h" ]]; then
    BUILD_OPTS+=('--without-selinux')
fi

    PKG_CONFIG_PATH="${BUILD_PKGCONFIG[*]}" \
    CPPFLAGS="${BUILD_CPPFLAGS[*]}" \
    CFLAGS="${BUILD_CFLAGS[*]}" CXXFLAGS="${BUILD_CXXFLAGS[*]}" \
    LDFLAGS="${BUILD_LDFLAGS[*]}" LIBS="${BUILD_LIBS[*]}" \
./configure --prefix="$INSTALL_PREFIX" --libdir="$INSTALL_LIBDIR" \
    "${BUILD_OPTS[*]}"

배열을 사용하여 구성하면 다음과 같은 결과가 발생합니다.

configure: error: invlaid package name: xml2 --without-x --without-sound --without-xpm --without-jpeg --without-tiff --without-gif ...

나는 이미 경험했다10.2. 배열 변수그러나 나는 내가 뭘 잘못하고 있는지 이해하지 못합니다. 큰따옴표로 변경하고 따옴표를 사용하지 않아도 도움이 되지 않았습니다.

문제는 무엇이고 어떻게 해결하나요?

답변1

에서 man bash:

   Any element of an array may  be  referenced  using  ${name[subscript]}.
   The braces are required to avoid conflicts with pathname expansion.  If
   subscript is @ or *, the word expands to all members  of  name.   These
   subscripts  differ only when the word appears within double quotes.  If
   the word is double-quoted, ${name[*]} expands to a single word with the
   value  of each array member separated by the first character of the IFS
   special variable, and ${name[@]} expands each element of name to a sep‐
   arate  word.

TL/DR: "${BUILD_PKGCONFIG[@]}"대신 사용됨"${BUILD_PKGCONFIG[*]}"

표시하려면:

$ arr=('foo' 'bar baz')
$ printf '%s\n' "${arr[*]}"
foo bar baz
$ 
$ printf '%s\n' "${arr[@]}"
foo
bar baz

답변2

배열의 모든 요소를 ​​확장하여 단일 인수로 중간 공백으로 연결합니다.

"${arrayname[@]}"대신 사용하면 "${arrayname[*]}"원하는 결과를 얻을 수 있습니다.

자세한 내용을 참조하세요 LESS='+/^[[:space:]]*Arrays' man bash.

관련 정보