누군가 zsh에서 다음 스크립트의 결과를 나에게 설명해 줄 수 있습니까?
#!/bin/zsh
var1=var2
var2=first
var3=second
echo var1="$var1"
echo var2="$var2"
echo var3="$var3"
echo '${${(P)var1::=var3}}'="${${(P)var1::=var3}}"
echo var1="$var1"
echo var2="$var2"
echo var3="$var3"
echo ------------
var1=var2
var2=first
var3=second
echo var1="$var1"
echo var2="$var2"
echo var3="$var3"
echo '${(P)var1::=var3}'="${(P)var1::=var3}"
echo var1="$var1"
echo var2="$var2"
echo var3="$var3"
결과:
var1=var2
var2=first
var3=second
${${(P)var1::=var3}}=second
var1=var2
var2=var3
var3=second
------------
var1=var2
var2=first
var3=second
${(P)var1::=var3}=var3
var1=var2
var2=var3
var3=second
내가 이해하는 한 zsh 매뉴얼(14.3.2 규칙), 첫 번째 부분(------ 위)의 실행은 다음과 같아야 합니다.
- 포인트 7 (::= 연산자 적용) (var1을 var3으로 설정)
- 포인트 25(적용(P) 연산자)(var1 역참조, var3 가져오기)
- var3의 값 출력: 'second'
이러한 단계는 결과의 다음 줄과 일치합니다.
${${(P)var1::=var3}}=second
그런데 결과에 다음 줄이 나타나는 이유는 무엇입니까?
var1=var2
var2=var3
예상 대신 :
var1=var3
var2=first
두 번째 부분(아래----)의 실행은 (설명서에 따라) 다음과 같아야 합니다.
- 포인트 4(적용(P) 연산자)(var1 역참조, var2 가져오기)
- 포인트 7 (::= 연산자 적용) (var2를 var3으로 설정)
- var2의 값을 출력합니다: 'var3'
이 섹션의 결과는 위의 설명과 완벽하게 일치하므로 문제는 첫 번째 부분에만 있습니다.
답변1
(P)
할당 전에 적용되므로 다음과 같습니다.
${(P)var1::=var3}
->${var2::=var3}
- ->
${var3}
- ->
second
var3
에 할당 되었습니다 var2
.
다른 주문을 강제하려면 다음을 사용하세요.${${(P)${var1::=var3}}}
이러한 규칙과 관련하여 설명서의 참고 사항을 참고하세요.
Zsh 개발팀은 이를 수락합니다.책임 없음다음 규칙을 읽는 동안 발생할 수 있는 뇌 손상에 대해.