zsh의 함수 정의에서 변수 확장

zsh의 함수 정의에서 변수 확장

zsh에서 함수를 정의할 때 변수를 평가/확장하는 데 문제가 있습니다. 이것이 가능합니까? 예:

variable=foo
mytest(){
  echo ${variable}  
}
mytest           //outputs foo
variable=bar
test           //outputs bar

test()의 변수가 foo로 유지되고 더 이상 $variable의 영향을 받지 않기를 바랍니다. 설명서를 읽고 평가 및 다양한 참조를 시도했지만 아무 것도 작동하지 않는 것 같습니다.

답변1

일단 설정된 값을 유지하는 변수가 함수 내부에 있어야 합니다. 이 작업은 전역 변수로만 수행할 수 있으므로 다음과 같이 다른 이름을 지정해야 합니다.

xtest(){
  typeset -g test_variable
  : ${test_variable:=$variable}
  echo $test_variable
}

이는 test_variable함수가 처음 호출될 때 설정되지만 이후에는 덮어쓰여지지 않습니다.

업데이트: Stéphane Chazelas가 제공한 설명을 기반으로 함수 정의 구문을 변경하고 함수 이름을 test에서 xtest로 바꿨습니다. 어쨌든 함수 이름을 "test"로 지정하는 것은 나쁜 생각이기 때문입니다.

답변2

zsh먼저 Bourne 쉘의 함수 정의 구문은 다음과 같습니다.

funcname() cmd

(ksh 구문과 기타 몇 가지 구문도 지원하지만 function funcname {...})

funzsh구문 키워드가 아닙니다 . 의 경우 및 기능을 본문으로 fun foo() cmd정의할 수 있습니다 .funfoocmd

또한 표준 명령(내장 및 대부분의 Bourne 유사 쉘) 이름을 test함수 이름으로 사용하지 않는 것이 좋습니다.testzsh

당신이 하나를 원한다면현지의고정된 값을 갖는 변수의 경우 해당 값을 함수 정의에 포함해야 합니다.

mytest() {
  local variable=test
  echo $variable
}

variable이 함수에 로컬이지만 mytest이 함수에 의해 호출된 다른 함수(있는 경우)에는 여전히 표시됩니다. 다른 함수에서 숨기려면(즉, 정적으로 범위 지정) 대신 (모듈 private에서 )을 사용할 수 있습니다 .zsh/param/privatelocal

네가 그걸 원한다면고정값$variable정의 시 전역 변수의 값으로 mytest다음과 같이 정의에 포함해야 합니다.

zmodload zsh/param/private
eval '
  mytest() {
    private variable='${(qq)variable}'
    echo $variable
    otherfunction ...
  }
'

${(qq)...}변수의 내용을 정의에 포함합니다(올바른 인용문 포함).

관련 정보