programing

함수 내부에서 함수 이름을 결정하는 방법

oldcodes 2023. 4. 19. 23:28
반응형

함수 내부에서 함수 이름을 결정하는 방법

다음과 같은 Bash 스크립트가 있는 경우:

#!/bin/bash

f() {
  # echo function name, "f" in this case
}

어떻게 할 수 있을까요?이것은 다음과 같은 도움말메시지에 사용할 수 있습니다.

printf "Usage: %s: blah blah blah \n" $(basename $0) >&2; 

이 경우에 한해서 내가 원한 것이 아니다.$0스크립트의 파일 이름입니다.

사용할 수 있습니다.${FUNCNAME[0]}bash함수 이름을 가져옵니다.

Bash 레퍼런스 매뉴얼:

기능명

실행 콜 스택에 현재 있는 모든 셸 함수의 이름을 포함하는 배열 변수입니다.인덱스 0의 요소는 현재 실행 중인 셸 함수의 이름입니다.맨 아래 요소(인덱스가 가장 높은 요소)는 "main"입니다.이 변수는 셸 함수가 실행 중일 때만 존재합니다.FUNCNAME 에의 할당은 무효가 되어 에러 상태가 반환됩니다.FUNCNAME 이 설정되어 있지 않은 경우는, 그 후에 리셋 되어도, 그 특수한 속성이 없어집니다.

이 변수는 BASH_LINENO 및 BASH_SOURCE와 함께 사용할 수 있습니다.FUNCNAME의 각 요소에는 콜 스택을 설명하기 위한 대응하는 요소가 있습니다.예를 들어 ${FUNCNAME[$i]}이(가) ${BASH_SOURCE[$i+1] 파일 ${BASH_LINENO[$i]}에서 호출되었습니다.발신자 빌트인은 이 정보를 사용하여 현재 콜스택을 표시합니다.

인덱스 없이 bash 어레이에 액세스하면 어레이의 첫 번째 요소가 반환되므로$FUNCNAME는 현재 함수의 이름을 지정하는 간단한 경우로 동작하지만 콜스택 내의 다른 모든 함수도 포함되어 있습니다.예를 들어 다음과 같습니다.

# in a file "foobar"
function foo {
    echo foo
    echo "In function $FUNCNAME: FUNCNAME=${FUNCNAME[*]}" >&2
}

function foobar {
    echo "$(foo)bar"
    echo "In function $FUNCNAME: FUNCNAME=${FUNCNAME[*]}" >&2
}

foobar

유언 출력:

$ bash foobar
In function foo: FUNCNAME=foo foobar main
foobar
In function foobar: FUNCNAME=foobar main

사용하고 있다${FUNCNAME[0]}현재 기능 이름을 인쇄하다

함수명을(함수내에서) 취득하는 가장 간단한 방법은, 사용하고 있는 셸에 의해서 다릅니다.

Zsh 버전
someFunctionName() {
   echo $funcstack[1]
}
Bash 버전
someFunctionName() {
   echo ${FUNCNAME[0]}
}
둘다요.
someFunctionName() {
  currentShell=$(ps -p $$ | awk "NR==2" | awk '{ print $4 }' | tr -d '-')
  if [[ $currentShell == 'bash' ]]; then
    echo ${FUNCNAME[0]}
  elif [[ $currentShell == 'zsh' ]]; then
    echo $funcstack[1]
  fi
}
보다 견고한 버전
columnX () {
    awk "{print \$$1}"
}
rowX () {
    awk "NR==$1"
}

checkShell() {
    ps -p $$ | columnX 4 | rowX 2 | tr -d - 
    # produces bash or zsh (or other shell name like fish)
}

showMethodName(){
    checkShell && echo ${FUNCNAME[0]} || echo $funcstack[1] 
}
showMethodName

또 다른 예는 다음과 같습니다.

# in a file "foobar"
foo() {
    echo "$FUNCNAME fuction begins"
}

foobar() {
    echo "$FUNCNAME fuction begins"
}

echo 'begin main'
foo
foobar
echo 'end main'

유언 출력:

begin main
foo fuction begins
foobar fuction begins
end main

언급URL : https://stackoverflow.com/questions/1835943/how-to-determine-function-name-from-inside-a-function

반응형