배열을 환경 변수로 사용할 수 없습니다

배열을 환경 변수로 사용할 수 없습니다

왜 스크립트에서 env 배열 변수를 사용할 수 없는지 모르겠습니다.
내 안에 ~/.bashrc아니면~/.profile

export HELLO="ee"
export HELLOO=(aaa bbbb ccc)

셸에서:

> echo $HELLO
ee
> echo $HELLOO
aaa
> echo ${HELLOO[@]}
aaa bbbb ccc

스크립트에서:

#!/usr/bin/env bash
echo $HELLO
echo $HELLOO
echo ${HELLOO[@]}
---
# Return 
ee

왜?

답변1

bash환경 변수는 키-값 문자열 쌍만 될 수 있으므로 배열은 환경 변수가 될 수 없습니다.

기본적으로 경로 배열인 변수를 사용하여 쉘이 수행하는 작업을 수행 할 수 있습니다 $PATH. 배열을 배열 값에 없는 일부 특정 문자로 구분된 문자열로 변환합니다.

$ arr=( aa bb cc "some string" )
$ arr=$( printf '%s:' "${arr[@]}" )
$ printf '%s\n' "$arr"
aa:bb:cc:some string:

아니면 좀 더 깔끔하거나,

arr=( aa bb cc "some string" )
arr=$( IFS=:; printf '%s' "${arr[*]}" )
export arr

의 확장은 의 첫 번째 문자로 구분된 배열 요소가 되며 ${arr[*]}여기에서는 로 설정됩니다. 이렇게 하면 문자열의 요소가 다음과 같이 됩니다.arrIFS:분리된(아니요분리된) by :, 이는 끝에 있는 빈 요소(있는 경우)를 구별할 수 없음을 의미합니다.


환경 변수를 사용하여 값을 스크립트에 전달하는 또 다른 방법은 (분명히?) 명령줄 인수를 사용하는 것입니다.

arr=( aa bb cc )

./some_script "${arr[@]}"

그런 다음 스크립트는 위치 인수 $1등을 사용하거나 다음을 사용하여 전달된 인수에 하나씩 액세스합니다.$2$3$@

printf 'First I got "%s"\n' "$1"
printf 'Then  I got "%s"\n' "$2"
printf 'Lastly there was "%s"\n' "$3"

for opt in "$@"; do
    printf 'I have "%s"\n' "$opt"
done

답변2

배열은 bash에 따라 다릅니다. 환경 변수는 이름-값 쌍입니다.

읽다환경변수 지정, 그 중 일부는 다음과 같습니다.

환경 변수의 값은 문자열입니다. C 언어 프로그램의 경우 프로세스가 시작되면 환경이라는 문자열 배열이 제공되어야 합니다. 외부 변수가 배열을 가리킵니다.환경,로써 정의 된:

extern char **environ;

이 문자열은 다음과 같은 형식입니다.이름=값;이름"=" 문자를 포함할 수 없습니다.

답변3

현재 어레이 수출 상황 2021년 10월

배열 내보내기는 아직 완전히 구현되지 않았습니다. 명령을 사용하여 소스 코드를 복제할 수 있습니다 git clone https://git.savannah.gnu.org/git/bash.git ~/bash-src. Bash 소스 코드 ~/bash-src/config-top.h의 주석 처리된 154행을 살펴보십시오.

/* Define to 1 if you want to be able to export indexed arrays to processes
   using the foo=([0]=one [1]=two) and so on */
/* #define ARRAY_EXPORT 1 */

또한 429행의 코드 섹션에서는 다음과 같이 ~/bash-src/variables.c말합니다.

#if defined (ARRAY_VARS)
#  if ARRAY_EXPORT
      /* Array variables may not yet be exported. */
      if (*string == '(' && string[1] == '[' && string[strlen (string) - 1] == ')')
    {
      string_length = 1;
      temp_string = extract_array_assignment_list (string, &string_length);
      temp_var = assign_array_from_string (name, temp_string, 0);
      FREE (temp_string);
      VSETATTR (temp_var, (att_exported | att_imported));
      array_needs_making = 1;
    }
      else
#  endif /* ARRAY_EXPORT */
#endif

따라서 기본적으로 이 문제에는 더 많은 작업이 필요합니다.

해결책

동시에 BASH_ENV환경 스크립트를 가리킬 수 있는 변수를 내보낼 수 있습니다. 나는 그것을 넣고 /etc/bash.environment거기에 시스템 전체 배열을 선언했습니다. ~/.bashrc이와 같은 것을 포함할 수 있으며 export BASH_ENV="~/.bash.environment"이제 현재 사용자가 실행하는 모든 bash 프로세스는 이 파일을 받게 됩니다.

@them이 아래에 언급했듯이 ~/.bashrc대화형 및 비대화형 쉘 모두에 적용하려면 해당 구성이 필요합니다.

[ -r "~/.bash.environment" ] \
&& source "~/.bash.environment" \
&& export BASH_ENV="~/.bash.environment"

마지막으로 환경은 다음과 같습니다.

# ~/.bash.environment
export HELLO="ee"
export HELLOO=(aaa bbbb ccc)

비지속적 해결 방법

배열 전달에 대한 빠르고 지저분한 비지속적 솔루션은 다음과 같을 수 있습니다. 프로세스 교체로 생성된 명명된 파이프를 환경 변수 <()에 할당합니다.BASH_ENV

BASH_ENV=<(declare -p HELLO HELLOO) your_script.sh

최고의 소원

관련 정보