bash 함수 메타 데이터 할당 및 검사


10

나는 종종 개발 프로젝트에서 자주하는 많은 작업을 자동화하는 많은 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"
}

그러나 어떻게 든 bash 는 함수를로드 할 때가 아닌 주석을 무시하는 것처럼 보입니다. 따라서 주석이 손실 되고이 결과가 나타납니다.

func1 is a function
func1 () 
{
    echo "do my automation"
}

함수에 메타 데이터를 할당하고 나중에 확인할 수있는 방법이 있습니까? type으로 정의를 검사 할 때 검색 할 수 있습니까?


1
아니 솔루션 (따라서 주석)하지만, 내가 해결 방법 사용 여부를 확인하는 것 $1입니다 -h, 다음 printf/ echo한 줄 도움말 / 사용 / 뭐든간에.
John N

답변:


13
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
흠, bash의 docstrings. 누가 알았 겠어?
Brian Minton

그 의견을 쿼리하는 방법이 있습니까? 나는 모든 명령에 대한 관대 한 도움 기능을 생각합니다.
yucer

7

예, 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"
}

2
변수를 저장하지 않으려면 nop 연산자 ":"를 다음과 같이 사용할 수 있습니다. function func () {: "metadata"# do yours}
Luchostein

1
docstring에 원치 않는 확장이 숨겨져있는 경우를 대비하여 작은 따옴표가 큰 따옴표보다 낫다고 생각합니다.
Digital Trauma

6

nop builtin을 사용할 수 있습니다 :. 또한 변수로 저장할 필요가 없습니다.

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또는 type배열의 키 만 쿼리하지만,의 출력.


1
조심하십시오 your metadata here-부작용이있는 확장이 포함될 수 있습니다. @AlexP의 답변과 같은 작은 따옴표를 사용하는 것이 좋습니다.
Digital Trauma

그렇습니다. 그러나 따옴표 안에 조심해야합니다.
Luchostein

3

당신은 이것을 할 수 있습니다.

$ f() { This function does nothing. 2> /dev/null; }
$ f
$ type f
f is a function
f () 
{ 
    This function does nothing. 2> /dev/null
}

그러나 함수는 주석이 달린 후에도 여전히 그 일을해야합니다. 샘플에서 정상적으로 함수를 호출 할 때 에코가 계속 작동해야합니다.
yucer

@yucer 것입니다. 이것은 단지 예시 일뿐입니다. 시도 해봐. 그러나 한계가 있습니다. 같은 특수 문자를 사용할 (수 없으며 첫 단어는 유효한 명령이 아니어야합니다.

확인. 실행하는 데 시간이 더 걸리지 만 올바른 답변이라고 생각합니다. 또한 예제에서 사용한 에코와 메타 데이터를 포함하는 것이 좋습니다.
yucer December
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.