여러 환경 변수를 단일 변수에 할당하고 명령을 기반으로 확장합니다.

여러 환경 변수를 단일 변수에 할당하고 명령을 기반으로 확장합니다.

명령을 실행하는 다양한 주문 전에 동일한 환경 변수 문자열을 반복하고 싶다고 가정해 보겠습니다.

if [[ some_thing ]]; then
    TZ=GMT LC_ALL=C LONG_ENV_VAR=foo my_command
elif [[ some_other_thing ]]; then
    TZ=GMT LC_ALL=C LONG_ENV_VAR=foo my_command --with-arg
else
    TZ=GMT LC_ALL=C LONG_ENV_VAR=foo my_command --with-other-arg
fi

그것들을 결합할 수 있는 방법이 있나요? 몇 가지 옵션

  1. 그들을 설정함으로써export

    export TZ=GMT
    export LC_ALL=C
    export LONG_ENV_VAR=foo
    if [[ ]] # ...
    

    이것은 작동하지만 환경에 설정된 상태를 유지하고 싶지 않습니다.

  2. 변수 변수를 만들어 보세요!

    local cmd_args="TZ=GMT LC_ALL=C LONG_ENV_VAR=foo"
    

    불행히도 다음을 통해 실행하려고 하면:

    $cmd_args my_command
    

    나는 가지고있다 TZ=GMT: command not found.

  3. 매번 모두 나열하십시오.

저도 구글링을 해봤는데 "환경 변수 변수"는 검색하기 가장 쉬운 용어가 아니고, 결과도 나오지 않았습니다. #2에서 내가 하려는 일에 대한 해결책이 있나요? 아니면 #1의 일부 버전을 고수한 다음 변수를 설정 해제해야 합니까?

답변1

이를 위해 서브셸을 사용할 수 있습니다.

(
  export TZ=GMT LC_ALL=C LONG_ENV_VAR=foo
  if [[ some_thing ]]; then
    exec my_command
  fi
)

이를 통해 변수를 한 번 명확하게 설정할 수 있습니다. 하위 쉘에서 실행하는 모든 항목에 표시되고 기본 쉘 환경에는 표시되지 않습니다.

답변2

이를 수행하는 방법에는 여러 가지가 있습니다. 개인적으로 저는 이 기능이 더 명확하다고 생각합니다.

run_this(){
   TZ=GMT LC_ALL=C LONG_ENV_VAR=foo "$@"
}

if [[ some_thing ]]; then
    run_this my_command
elif [[ some_other_thing ]]; then
    run_this my_command --with-arg
else
    run_this my_command --with-other-arg
fi 

답변3

포인트 2는 다음을 통해 달성할 수 있습니다 env.

local env_args="greppable1=foo greppable2=bar"
env $env_args perl -E 'say for grep /greppable/, keys %ENV'

그러나 env 매개변수에 공백이 있는 경우 bash 토큰화 규칙으로 인해 이 문제가 복잡해질 수 있습니다.

답변4

arg 배열의 용도는 다음과 같습니다.

if    thing
then  set --
elif  something
then  set -- --with_arg
else  set -- --other_arg
fi&&  TZ=GMT LC_ALL=C LONG_ENV_VAR=foo my_command "$@"

기억하세요: 빈 "$@"!= "". 오직거기엔 없어.

관련 정보