함수 결과를 보유하는 전역 변수의 이름에 대한 규칙이 있습니까?

함수 결과를 보유하는 전역 변수의 이름에 대한 규칙이 있습니까?

쉘 함수가 결과를 "반환"하는 일반적인 방법은 이를 전역 변수에 할당하는 것입니다.

이 변수 이름에 대한 규칙/모범 사례가 있습니까?

답변1

REPLY일반적으로 이러한 목적으로 사용됩니다. 이는 read및 적어도 에서 select사용됩니다 bash.kshzsh

zsh문서 에서 :

회신하다
이 매개변수는 함수 호출이나 리디렉션이 불가능하거나 필요하지 않을 때 쉘 스크립트와 쉘 내장 사이에 문자열 값을 전달하기 위해 규칙에 따라 예약되어 있습니다. 내장 명령 read 및 복합 명령 select는 REPLY를 설정할 수 있으며, 파일 이름 생성은 특정 표현식을 평가할 때 해당 값을 설정하고 확인합니다. 일부 모듈에서는 비슷한 목적으로 REPLY를 사용합니다.

회신하다
REPLY와 동일하지만 문자열 대신 배열 값에 사용됩니다.

그러나 이 변수의 유형을 변경할 때 잠재적인 영향을 알고 있어야 합니다.

또 다른 방법은 변수 이름을 매개변수로 전달하는 것입니다.

get_date() {
  local date
  date=$(date)
  eval "$1=\$date"
}

get_date라는 변수를 사용하여 호출하면 아무런 효과가 없습니다 date. ksh93이 문제는 호출자 범위에서 변수를 참조하는 방법인 nameref를 도입하여 해결되었습니다. bashNameref 지원이 최근 추가되었지만 동일한 범위의 변수를 (이름만으로) 참조하므로 유용하지 않습니다.

function get_date {
  typeset -n var=$1
  var=$(date)
}

에서는 ksh93호출해도 유효합니다 get_date var. 하는 방법이 있습니다일하다bash, 그리고 버그를 악용하지만 나중에 버그가 수정될 수 있으므로 거기까지는 가지 않겠습니다 .mkshyashunset

또 다른 접근 방식은 위치 매개변수를 $1제외한 모든 변수를 설정하기 위해 함수에서 지역 변수를 사용하지 않는 것입니다 . $2그러나 이로 인해 코드를 읽을 수 없게 될 수 있습니다. 예를 들어 참조하십시오.getopts_long쉘 기능 구현.

관련 정보