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.