왜 스크립트에서 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[*]}
여기에서는 로 설정됩니다. 이렇게 하면 문자열의 요소가 다음과 같이 됩니다.arr
IFS
:
분리된(아니요분리된) 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
최고의 소원