다음 셸 함수와 별칭을 정의한다고 가정합니다 .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에 할당하는 값은 별칭에 영향을 주지 않습니다.
대조적으로, 이 함수는 처리하는 동안 환경 변수를 평가하지 않습니다. 함수의 환경 변수는 함수가 호출될 때 평가됩니다.