![Bash 함수 메타데이터 할당 및 검사](https://linux55.com/image/100562/Bash%20%ED%95%A8%EC%88%98%20%EB%A9%94%ED%83%80%EB%8D%B0%EC%9D%B4%ED%84%B0%20%ED%95%A0%EB%8B%B9%20%EB%B0%8F%20%EA%B2%80%EC%82%AC.png)
나는 개발 프로젝트에서 일반적으로 수행하는 많은 작업을 자동화하는 많은 bash 기능을 자주 생성하고 등록합니다. 그 세대는 내가 작업 중인 프로젝트의 메타데이터에 따라 달라집니다.
다음과 같이 생성된 프로젝트에 대한 정보로 이러한 함수에 주석을 달고 싶습니다.
func1() {
# This function was generated for project: PROJECT1
echo "do my automation"
}
이상적으로는 정의를 검사할 때 주석을 볼 수 있습니다.
$ type func1
func1 is a function
func1 ()
{
# This function was generated for project: PROJECT1
echo "do my automation"
}
하지만 왠지세게 때리다함수가 실행될 때가 아니라 함수가 로드될 때 주석이 무시되는 것 같습니다. 따라서 주석이 손실되고 다음 결과를 얻습니다.
func1 is a function
func1 ()
{
echo "do my automation"
}
함수에 메타데이터를 할당한 다음 검사하는 방법이 있나요? 유형 검사 정의를 사용할 때 검색할 수 있나요?
답변1
function func_name()
{
: '
Invocation: func_name $1 $2 ... $n
Function: Display the values of the supplied arguments, in double quotes.
Exit status: func_name always returns with exit status 0.
' :
local i
echo "func_name: $# arguments"
for ((i = 1; i <= $#; ++i)); do
echo "func_name [$i] \"$1\""
shift
done
return 0
}
답변2
네, type
실행될 함수의 일부만 출력하는 것 같습니다. 실제로는 그것이 쿼리할 때 관심을 갖는 부분이기 때문에 실제로는 그것이 합리적인 것 같습니다 type
.
해결 방법으로 주석을 사용하는 대신 다음과 같은 메타데이터를 추가하세요.
func1() {
meta="This function was generated for project: PROJECT1"
echo "do my automation"
}
실제로 이 변수를 사용할 필요는 없지만 다음을 사용하여 함수를 쿼리할 때 나타납니다 type
.
$ type func1
func1 is a function
func1 ()
{
meta="This function was generated for project: PROJECT1";
echo "do my automation"
}
답변3
당신은 그것을 사용할 수 있습니다아니요내장 :
. 또한 변수로 저장할 필요도 없습니다.
function f() {
: your metadata here
: "or here"
# do yours
}
편집하다: 메타데이터의 특수문자에 주의하세요. 일반 텍스트의 경우 다음을 사용할 수 있습니다.
: <<EOT
Your metadata text here.
EOT
편집하다: 전역 연관 배열을 사용하여 모든 기능에 대한 메타데이터를 저장할 수 있습니다.
declare -A METADATA=()
METADATA[fun1]='foo bar'
function fun1() {
echo I have some metadata: "${METADATA[$FUNCNAME]}"
}
METADATA[fun2]='baz you'
function fun2() {
echo I have some other metadata: "${METADATA[$FUNCNAME]}"
}
이렇게 하면 declare
or 의 출력을 구문 분석할 필요가 없고 type
배열에서 해당 키를 쿼리하기만 하면 됩니다.
답변4
당신은 이것을 할 수 있습니다.
$ f() { This function does nothing. 2> /dev/null; }
$ f
$ type f
f is a function
f ()
{
This function does nothing. 2> /dev/null
}