나는 종종 개발 프로젝트에서 자주하는 많은 작업을 자동화하는 많은 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으로 정의를 검사 할 때 검색 할 수 있습니까?
답변
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
}
답변
예, 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"
}
답변
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
배열의 키 만 쿼리하지만,의 출력.
답변
당신은 이것을 할 수 있습니다.
$ f() { This function does nothing. 2> /dev/null; }
$ f
$ type f
f is a function
f ()
{
This function does nothing. 2> /dev/null
}