환경 변수를 통해 셸 함수 및 별칭 업데이트

환경 변수를 통해 셸 함수 및 별칭 업데이트

다음 셸 함수와 별칭을 정의한다고 가정합니다 .zshenv.

export VARIABLE_A='original'

function my_function()
{
    print $VARIABLE_A
}

export VARIABLE_B='original'

alias my_alias="print $VARIABLE_B"

이제 새로운 대화형 셸을 시작하고 다음을 수행한다고 가정해 보겠습니다.

$ my_function
$ export VARIABLE_A='new'
$ my_function


$ my_alias
$ export VARIABLE_B='new'
$ my_alias

위 명령은 다음을 인쇄합니다.

original
new
original
original

함수는 업데이트되었지만 별칭은 업데이트되지 않은 것 같습니다. 이 동작이 예상됩니까? 그렇다면 왜 그렇습니까?

답변1

예, 그러한 동작이 예상됩니다. 이유는 간단합니다. "…"별칭을 정의할 때 큰따옴표()를 사용하여 매개변수 대체를 허용했기 때문입니다. 이로 인해 $VARIABLE_B별칭이 실행될 때가 아니라 정의될 때 별칭이 대체됩니다.

기본적으로 글을 쓸 때

VARIABLE_B="original"
alias my_alias="print $VARIABLE_B"

zsh$VARIABLE_B다음과 같이 명령을 실행하기 전에 대체됩니다 alias.

alias my_alias="print original"

따라서 별칭은 실행 전에 my_alias항상 교체됩니다 .print original

실행 시 인수를 바꾸려면 작은따옴표( '…') 또는 다음으로 $인용 해야 합니다 \.

alias my_alias='print $VARIABLE_B'
alias my_alias="print \$VARIABLE_B"

이는 변수 이름이 여전히 명령의 일부이고 별칭이 실행 전에 my_alias실제로 대체되도록 별칭을 설정합니다.print $VARIABLE_B


대조적으로, 함수 정의 내의 매개변수는 명시적으로 참조할 필요가 없으며 항상 런타임에만 대체됩니다.

그래서 글을 쓸 때

my_function () {
{
    print $VARIABLE_A
}

이것이 바로 저장될 내용입니다. 실행하면 my_function $VARIABLE_A 현재 값으로 대체됩니다.

답변2

.zshenv에 다음 셸 함수와 별칭을 정의한다고 가정합니다.

별칭은 스크립트가 실행될 때 평가됩니다. 따라서 $VARIABLE_B는 .zshenv가 처리될 때 평가되고 해당 값으로 대체됩니다. 나중에 VARIABLE_B에 할당하는 값은 별칭에 영향을 주지 않습니다.

대조적으로, 이 함수는 처리하는 동안 환경 변수를 평가하지 않습니다. 함수의 환경 변수는 함수가 호출될 때 평가됩니다.

관련 정보