zsh 교체: (P) ::= 연산자와 상호작용합니다.

zsh 교체: (P) ::= 연산자와 상호작용합니다.

누군가 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 규칙), 첫 번째 부분(------ 위)의 실행은 다음과 같아야 합니다.

  1. 포인트 7 (::= 연산자 적용) (var1을 var3으로 설정)
  2. 포인트 25(적용(P) 연산자)(var1 역참조, var3 가져오기)
  3. var3의 값 출력: 'second'

이러한 단계는 결과의 다음 줄과 일치합니다.

${${(P)var1::=var3}}=second

그런데 결과에 다음 줄이 나타나는 이유는 무엇입니까?

var1=var2
var2=var3

예상 대신 :

var1=var3
var2=first

두 번째 부분(아래----)의 실행은 (설명서에 따라) 다음과 같아야 합니다.

  1. 포인트 4(적용(P) 연산자)(var1 역참조, var2 가져오기)
  2. 포인트 7 (::= 연산자 적용) (var2를 var3으로 설정)
  3. var2의 값을 출력합니다: 'var3'

이 섹션의 결과는 위의 설명과 완벽하게 일치하므로 문제는 첫 번째 부분에만 있습니다.

답변1

(P)할당 전에 적용되므로 다음과 같습니다.

  1. ${(P)var1::=var3}->${var2::=var3}
  2. ->${var3}
  3. ->second

var3에 할당 되었습니다 var2.

다른 주문을 강제하려면 다음을 사용하세요.${${(P)${var1::=var3}}}

이러한 규칙과 관련하여 설명서의 참고 사항을 참고하세요.

Zsh 개발팀은 이를 수락합니다.책임 없음다음 규칙을 읽는 동안 발생할 수 있는 뇌 손상에 대해.

관련 정보