명령을 실행하는 다양한 주문 전에 동일한 환경 변수 문자열을 반복하고 싶다고 가정해 보겠습니다.
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
그것들을 결합할 수 있는 방법이 있나요? 몇 가지 옵션
그들을 설정함으로써
export
export TZ=GMT export LC_ALL=C export LONG_ENV_VAR=foo if [[ ]] # ...
이것은 작동하지만 환경에 설정된 상태를 유지하고 싶지 않습니다.
변수 변수를 만들어 보세요!
local cmd_args="TZ=GMT LC_ALL=C LONG_ENV_VAR=foo"
불행히도 다음을 통해 실행하려고 하면:
$cmd_args my_command
나는 가지고있다
TZ=GMT: command not found
.매번 모두 나열하십시오.
저도 구글링을 해봤는데 "환경 변수 변수"는 검색하기 가장 쉬운 용어가 아니고, 결과도 나오지 않았습니다. #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 "$@"
기억하세요: 빈 "$@"
!= ""
. 오직거기엔 없어.