대화형 사용을 위한 함수에 사용법 설명 표시

대화형 사용을 위한 함수에 사용법 설명 표시

.bashrc터미널에서 대화형으로 사용하기 위해 my에 정의된 여러 함수가 있습니다 . 나는 보통 그 의도된 용도를 설명하는 설명을 앞에 붙입니다.

# Usage: foo [bar]
# Foo's a bar into a baz
foo() {
  ...
}

소스 코드를 탐색하는 경우에는 괜찮지만, type함수가 수행하는 작업을 빠르게 기억하려면 터미널에서 실행하는 것이 더 좋습니다. 그러나 여기에는 (당연히) 주석이 포함되지 않습니다.

$ type foo
foo is a function
foo ()
{
    ...
}

type이로 인해 "이 주석이 지속되어 Python의 정신으로 표시될 수 있다면 좋지 않을까?"라는 생각이 들었습니다.독스트링나는 이것을 생각해 냈습니다 :

foo() {
  : Usage: foo [bar]
  : "Foo's a bar into a baz"
  ...
}

$ type foo
foo is a function
foo ()
{
    : Usage: foo [bar];
    : "Foo's a bar into a baz";
    ...
}

type이제 사용량이 출력 에 포함됩니다 ! 물론 보시다시피 인용은 오류가 발생하기 쉬운 문제가 되지만 작동하면 더 나은 사용자 경험을 제공합니다.

그래서 제 질문은 이것이 나쁜 생각인가요?입니다. Bash 기능 사용자에게 추가 컨텍스트를 제공하는 더 나은 대안(예: man/ for function ) 이 있습니까 ?info

이상적으로는 사용 지침이 함수 정의 근처에 위치하여 소스 코드를 보는 사람들도 이점을 얻을 수 있기를 원하지만 이를 수행하는 "올바른" 방법이 있다면 대안이 열려 있습니다.

편집하다이것은 상당히 간단한 도우미 함수입니다. 저는 대화식으로 추가 컨텍스트를 얻고 싶었습니다. 물론 플래그를 구문 분석하는 더 복잡한 스크립트의 경우 옵션을 추가하겠지만 --help이러한 스크립트의 경우 모든 항목에 도움말 플래그를 추가하는 것은 약간 번거로울 수 있습니다. 아마도 그것은 내가 받아들여야 할 비용일 수도 있지만, 이 :해킹은 합리적으로 잘 작동하는 것으로 보이며 편집자가 소스 코드를 읽기 더 어렵게 만들지는 않습니다.

답변1

나는 이것을 수행하는 좋은 방법이 하나만 있다고 생각하지 않습니다.

많은 함수, 스크립트 및 기타 실행 파일은 사용자가 제공 -h하거나 옵션으로 제공하는 경우 도움말 메시지를 제공합니다.--help

$ foo() {
[[ "$1" =~ (-h|--help) ]] && { cat <<EOF
Usage: foo [bar]
Foo's a bar into a baz
EOF
return;
}
: ...other stuff...
}

예를 들어:

$ foo -h
Usage: foo [bar]
Foo's a bar into a baz

$ foo --help
Usage: foo [bar]
Foo's a bar into a baz

답변2

나는 한 번도상당히자신을 설득하여 급락하고 :명령을 의사 주석으로 사용하십시오. 특히, "주석"이 실제로 평가할 매개변수이고 부작용이 있을 수 있다는 점(또는 버그와 같은 문제가 발생할 수 있음 ') 에 대해 걱정했습니다 . 나는 여전히 아이디어의 단순함을 좋아하지만, 트레이드오프가 정당화될 수는 없다고 생각합니다.

로고나 이와 유사한 것을 통해 텍스트 사용을 제안하는 것을 주저하는 것은 --help항상 그에 따른 문제였습니다. 플래그를 받아들이기 시작하면, 일반적으로 (Bash에서) 요구되는 본격적인 매개변수 구문 분석에 빠르게 들어갑니다.꽤 많은 상용구.

이 격차를 부분적으로 메우기 위해 저는작은 유틸리티 프로그램getopts이 상용구를 줄이려면 래핑하세요. 아직은 몇 줄을 차지하기 때문에 다른 아주 작은 기능에는 사용하지 않겠지만, 직접 사용하는 것보다는 훨씬 깔끔합니다 getopts. 다음은 플래그를 사용한 사용 예입니다 -h( getopts단일 문자 옵션만 지원됨).

foo() {
  local _usage='foo [-a] [-b] [-f val] [-v val] [args ...]'
  eval "$(parse_opts 'f:v:abh')"
  if (( h )); then
    echo "Usage: $_usage"
    return 0
  fi
  echo "f=$f v=$v a=$a b=$b -- $#: $*"
}

관련 정보