함수를 사용할 수 있는지 테스트

함수를 사용할 수 있는지 테스트

함수가 포함된 파일을 아직 가져오지 않은 경우 함수를 사용할 수 있는지 테스트할 수 있나요?

답변1

bash(또는 ksh해당 구문의 출처 또는 zsh1) 에서 다음을 수행할 수 있습니다.

if typeset -f myfunction > /dev/null; then
  echo The myfunction function is defined
fi

이는 ksh(이 구문의 출처) 및 zsh에서도 작동합니다.

에서는 zsh다음 작업도 수행할 수 있습니다.

if (( $+functions[myfunction] )) then
  echo The myfunction function is defined
fi

이는 함수 이름을 해당 정의에 매핑하는 특수 연관 배열의 존재 여부를 테스트하는 것입니다 myfunction(두 방법 모두 아직 로드되지 않은 자동 로드 가능 함수에도 작동합니다).

별칭도 있는 경우 동일한 이름의 함수를 사용하려면 별칭이나 최소한 일부( 'cmd' args별칭 아님 cmd args)를 인용해야 합니다. 쉘 예약어에도 동일한 내용이 적용되지만, bash에서는 어쨌든 예약어와 동일한 이름을 가진 함수를 정의하는 것을 허용하지 않습니다.

@JJao가 의견에서 제안했듯이 type -t(bash 또는 최신 버전 ksh93에서) 명령 유형을 알려줄 수도 있습니다 myfunction.

case $(type -t myfunction) in
  (function) echo OK;;
  (alias) echo might exist as a function but it is first an alias;;
  (*) echo cannot be used as a function;;
esac

1 의 경우 yashAPI가 약간 다릅니다 typeset -f myfunction.진짜함수를 정의할 때 출력이 생성되지 않습니다. 그렇지 않으면 반환됩니다.잘못된그리고 오류 메시지를 출력합니다. 함수의 정의를 yash로 인쇄 해야 합니다 typeset -pf myfunction(ksh/zsh/bash에서도 작동하지만 -p필수는 아닙니다). 그래서, 당신은해야합니다 if typeset -f myfunction 2> /dev/null. 이렇게 하면 if typeset -f myfunction > /dev/null 2>&1네 개의 쉘 모두에 이식 가능해집니다.

답변2

시험 결과

type functionname

$ if type existingfunction >/dev/null 2>&1 ; then echo yes ; else echo no ; fi
yes
$

$ if type nonexistingfunction >/dev/null 2>&1 ; then echo yes ; else echo no ; fi
no
$

답변3

코드 가독성과 정확성을 위해 나는

if [[ "$(type -t myfunction)" = "function" ]] ; then
   # the function is defined and accesible
fi

내장 또는 .type​ only를 사용하면 별칭, 내장 함수, 파일 등도 검색하고 원하지 않는 개체 유형에 대해 0(true)을 반환할 수 있습니다.help typeman bashtype text

관련 정보