긴 이름에 단일 대시 사용

긴 이름에 단일 대시 사용

getopt 또는 optparse를 사용하여 옵션을 설정할 때 대시 하나가 문자 하나에 해당한다는 것을 알고 있습니다. 하지만 어쨌든 여러 문자에 단일 대시를 사용할 수 있습니까 -apply?

대시는 짧은 이름을 나타내며 일반적으로 사람들은 이를 나타내기 위해 하나의 문자를 사용한다는 것을 알고 있습니다. 그러나 일부 명령(예: find -printf)은 단일 대시가 포함된 긴 이름을 사용합니다.

Linux의 bash에서 대시와 함께 긴 이름을 사용하는 방법을 아는 사람이 있습니까( getopt또는 optparse다른 bash 도구 사용)?

답변1

~에서getopt맨페이지:

-a, --alternative
        Allow long options to start with a single '-'.

아니면 우리가 얘기하는 경우getopt*C 기능:

getopt_long_only() is like getopt_long(), but '-' as well as "--" can indicate a long option

답변2

GNU 시스템이 있고 단일 대시 긴 옵션이 필요한 경우 반드시 getopt_long또는 를 사용하십시오 getopt -a.

이 예는 find -printfGNU 확장에 대한 나의 관심을 끌었습니다. find원 대시 옵션은 GNU 시스템 외부에 존재하며 그 유산은 아마도 GNU 스타일의 긴 옵션보다 훨씬 오래되었을 것입니다. 따라서 이와 같은 프로그램은 을 find사용하지 않고 getopt_long명령줄 옵션을 수동으로 구문 분석할 수 있습니다. Bash에서는 다음과 같이 보일 수 있습니다:

$ cat args.sh
#!/bin/sh
foo=0
bar=0
while [ "$#" -ne 0 ] ; do 
        if [ "$1" = "-foo" ] ; then
                foo=1
        elif [ "$1" = "-bar" ] ; then
                shift
                bar=$1
        fi
        shift
done
echo foo: "$foo"
echo bar: "$bar"
$ ./args.sh -bar x -foo
foo: 1
bar: x

답변3

단일 문자 옵션을 구문 분석할 때 어려운 점은 번들로 묶일 수 있다는 것입니다(예: -ab와 동일 -a -b). GNU 스타일 긴 옵션의 한 가지 어려움은 인수가 연결될 수도 있고 연결되지 않을 수도 있다는 것입니다. 단일 대시 다중 문자 옵션을 사용하면 구문 분석에 어려움이 없으므로 수동으로 쉽게 수행할 수 있습니다.

단일 대시 다중 문자 옵션이 있는 대부분의 프로그램은 별도의 명령줄 인수로 인수를 허용합니다.

foo=
bar=default
require_argument () {
  if [ $# -eq 2 ]; then
    echo >&2 "$0: Option $1 requires an argument"
    exit 2
  fi
  eval "$1=\"\$3\""
}
while case "$1" in
        --) shift; false;;
        -foo) foo=1 
        -bar) require_argument bar "$@"; shift;;
        -?*) echo >&2 "$0: Unknown option $1"; exit 2;;
        *) false;;
      esac
do
  shift
done

GNU 스타일의 긴 옵션을 사용해 보세요. 그들의 행동은 더욱 표준화되었고 더 많은 사람들이 이에 익숙해졌습니다.

관련 정보