옵션과 매개 변수 사이의 공백을 생략 할 수있는 이유는 무엇입니까?


16

예를 들면 다음과 같습니다.

xargs -n 1

와 같다

xargs -n1

그러나 man 페이지 를 보면 옵션이로 표시되어 -n max-args공간이 보존되어야 함을 의미합니다. 약식 -n max-args 에 대해서는 아무것도 없습니다 .

이것은 다른 많은 리눅스 유틸리티에서도 발생합니다.

이것을 리눅스에서 무엇이라고 부릅니까? 모든 유틸리티가 축약 양식을 지원합니까 (하지만 맨 페이지에 문서화하지 마십시오)?


1
12.1.2.a 는 역사의 일부이다. 나는 이것에 대해 이미 좋은 질문이 있다고 맹세하지만 아직 찾지 못했습니다.

2
@drewbenn 당신이 생각하고있는 다른 질문은 내 것입니다 : unix.stackexchange.com/q/188046/41515

답변:


12

코드의 명령 줄 구문 분석 비트를 작성할 때 인수를 사용하는 옵션과 선택하지 않는 옵션을 지정합니다. 예를 들어, -h옵션 (예 : 도움말)과 -a인수를 사용해야 하는 옵션을 허용하는 셸 스크립트에서

opt_h=0     # default value
opt_a=""

while getopts 'a:h' opt; do
    case $opt in
        h)  opt_h=1 ;;
        a)  opt_a="$OPTARG" ;;
    esac
done

echo "h: $opt_h"
echo "a: $opt_a"

a:h비트는 "나는 두 가지 옵션을 구문 분석 할 것으로 예상하고있어,라고 -a하고 -h, 및 -a인수를 취해야한다"(그것은이다 :a그 파서 지시 -a인자가 소요을).

따라서 옵션이 끝나는 위치, 값이 시작되는 위치 및 그 이후에 다른 옵션이 시작되는 곳에 모호성이 없습니다.

그것을 실행 :

$ bash test.sh -h -a hello
h: 1
a: hello

$ bash test.sh -h -ahello
h: 1
a: hello

$ bash test.sh -hahello
h: 1
a: hello

그렇기 때문에 대부분의 경우 옵션을 파싱하기 위해 자체 명령 줄 파서를 작성해서는 안됩니다.

이 예에서는 까다로운 사례가 하나뿐입니다. 구문 분석은 일반적으로 옵션이 아닌 첫 번째 비 옵션에서 중지되므로 명령 줄에 옵션처럼 보이는 내용이있는 경우 :

$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello

다음은이를 해결합니다.

$ bash test.sh -a hello -- -world
h: 0
a: hello

--신호 명령 행 옵션의 끝, 그리고 -world비트가 (이 위치 변수 중 하나입니다)와 원하는 무엇이든 할 수있는 프로그램에 남아 있습니다.

그건 그렇고, 파일 이름의 시작 부분에 대시가있는 파일을 제거하는 방법입니다 rm.

편집 :

C 호출로 작성된 유틸리티 getopt()(로 선언 unistd.h)는 거의 같은 방식으로 작동합니다. 사실, 우리가 아는 한, bash함수 getopts는 C 라이브러리 함수를 호출하여 구현할 수 있습니다 getopt(). Perl, Python 및 기타 언어는 비슷한 명령 줄 구문 분석 라이브러리를 가지고 있으며 비슷한 방식으로 구문 분석을 수행 할 가능성이 높습니다.

이들 중 일부 getoptgetopt-like 라이브러리 루틴은 "긴"옵션을 처리합니다. 이들은 보통 이중 대시 ( --)가 앞에 오고, 인수를 취하는 긴 옵션은 종종 등호 뒤에 오는 --block-size=SIZE옵션입니다. 예를 들어 du유틸리티 의 [일부 구현] 옵션 ( -B SIZE같은 것을 지정할 수 있습니다 ).

매뉴얼이 짧은 옵션과 인수 사이에 공백을 표시하기 위해 작성되는 이유는 아마도 가독성을위한 것입니다.

편집 : 및 유틸리티 와 같은 실제 도구에는 대시 앞에 옵션이 없습니다. 이것은 전적으로 역사적인 이유로 그리고 소프트웨어가 그 방식으로 정확하게 작동하도록하는 소프트웨어와의 호환성을 유지하기위한 것입니다. 이 유틸리티는 최근에 대시가있는 옵션을 사용할 수있게되었습니다. BSD 매뉴얼은 "번들 플래그"에 대한 구식 옵션 을 호출합니다.ddtartartar


이 기능은 bash 스크립팅에서 쉽게 구현할 수 있습니다. 그러나 대부분의 유틸리티는 bash가 아닌 C로 작성된 다음 바이너리로 컴파일된다고 생각합니다. 이러한 유틸리티가이 기능을 구현하는 이유는 무엇입니까?
J.Joe

@ J.Joe 그들이 getopt()(으로 선언 unistd.h) 호출하기 때문에 같은 일을합니다.
Kusalananda

2
그렇습니다. 참조 . 이것은 또한 옵션이 결합 될 수 있다는 또 다른 미스터리를 해결합니다. -a -b=== -ab
J.Joe

1
플래그의 선택적 인수는 모호성을 생성하므로 조합 할 수 없습니다 ( -a선택적인 인수가 -ab있는 경우와 동일하지 않음 -a -b). GNU getopt는 비 플래그를 충족 할 때 플래그 처리를 중지하지 않습니다. 대신 (기본적으로) 대신 argv 앞에 플래그를 다시 섞습니다.
ilkkachu

@ilkkachu 설명해 주셔서 감사합니다. 나중에 답변을 업데이트 할 수 있습니다.
Kusalananda

4

xargsPOSIX 유틸리티 중 하나입니다. @drewbenn이 언급 한 것처럼 POSIX 는 12.1 Utility Argument Syntax에서 다음 과 같이 대부분 의 유틸리티에 대한 옵션 구문 분석 동작 과 일치 getopt하는 다른 구현에 대한 허용량을 문서화합니다 .

이 절에서는 표준 유틸리티의 인수 구문에 대해 설명하고 POSIX.1-2008에서 유틸리티가 처리하는 인수를 설명하는 데 사용되는 용어를 소개합니다.

POSIX.1-2008 내에서 유틸리티의 인수 구문을 설명하기 위해 특수 표기법이 사용됩니다. 별도의 언급이없는 한 , 모든 유틸리티 설명은이 표기법을 사용합니다 (이 예에서 설명 됨) (XCU 단순 명령 참조 ).

그리고 결론

향후 모든 유틸리티 및 응용 프로그램은이 지침을 사용하여 사용자 이식성을 향상시키는 것이 좋습니다. 기존 애플리케이션을 중단하지 않기 위해 일부 히스토리 유틸리티를 변경할 수 없다는 사실이이 미래 목표를 방해해서는 안됩니다.

POSIX 내에서 (가장 일반적으로 사용되는 유틸리티 만 다루는 것을 기억하십시오) 다른 매개 변수에서 위치 매개 변수 또는 특수 구문을 사용하는 매개 변수 로 옵션 인 피연산자를 전달하는 예외가 있습니다 .

POSIX는 선택적 옵션 값을 허용 합니다.

옵션 인수가 옵션으로 표시 <blank>되도록 옵션 인수가 '['']'기호로 묶인 경우를 제외하고 옵션 인수는 옵션 과 문자로 구분되어 표시됩니다.

어떤 POSIX 유틸리티가이 기능을 사용하는지 기억 나지 않습니다. ncurses ticinfocmp유틸리티는이 레벨 을 위한 기능을 사용합니다 .-v (verbose / debug) 옵션 .

질문 한 특정 요점은 해당 단락의 나머지 부분에 여러 줄로 자세히 설명되어 있습니다.

POSIX 이전 ps에는 선행 하이픈없이 허용되는 옵션을 일부 구현했습니다 . POSIX 설명은 유틸리티 설명 또는 구문 이론적 설명에서 언급하지 않습니다.

POSIX 외에도 옵션의 값을 옵션과 분리하거나 결합하는 다양한 방법을 사용하는 긴 옵션 구현 (GNU getopt_long 또는 X Toolkit 등 )이 있습니다. 예를 들어 구두점을 사용할 수 있습니다.

--option=value
--option value

구현에 따라, 이중 대시는 긴 옵션을 짧은 (getopt)과 구별하는 데 사용되거나 사용되지 않을 수 있습니다. lynx 및 X Toolkit은 단일 대시를 사용합니다. getopt_long예를 들어 GNU 는 이중 대시를 사용합니다. 또한+ 는 옵션이 무시되었음을 나타내는 데 사용될 수 있습니다.

POSIX의 설명에는이 중 어느 것도 언급되지 않은 것 같지만, 당신은 분명히 그것들을 접하게 될 것입니다.


되어 -option=value있어야 --option=value(긴 옵션 형식 대신 하나의 시작 부분에 두 개의 대시)?
J.Joe

일부 레거시 유틸리티는 단일 대시 긴 옵션 (-옵션)을 사용하지만 새로운 스크립트 및 프로그램에서는 더 이상 사용되지 않습니다. getopt에 의해 처리되는 짧은 옵션에는 단일 대시를 사용하십시오. 거의 모든 새로운 스크립트와 프로그램은 이중 대시 긴 옵션을 사용합니다. 많은 사람들이 가장 일반적으로 사용되는 단일 대시 짧은 옵션을 지원합니다. 긴 옵션은 스크립트 코드를 훨씬 더 자기 문서화하여 주석이 적습니다.
DocSalvager
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.