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

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

예를 들어:

xargs -n 1

동일합니까?

xargs -n1

하지만 당신이 보면매뉴얼 페이지, 옵션은 로 표시되며 -n max-args이는 공간이 예약되어야 함을 의미합니다. 축약된 형식 -n에는 아무것도 없습니다.최대 매개변수.

이는 다른 많은 Linux 유틸리티에서도 발생합니다.

리눅스에서는 이것을 뭐라고 부르나요? 모든 유틸리티가 축약된 형식을 지원합니까(그러나 매뉴얼 페이지에 문서화하지 마십시오)?

답변1

코드의 명령줄 구문 분석 비트를 작성할 때 인수를 사용하는 옵션과 인수를 사용하지 않는 옵션을 지정할 수 있습니다. 예를 들어, -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()( Resources 에 선언됨 unistd.h)는 거의 동일한 방식으로 작동합니다. 실제로 우리가 아는 한 이 bash기능은 getoptsC 라이브러리 함수를 호출하여 구현할 수 있습니다 getopt(). Perl, Python 및 기타 언어에는 모두 유사한 명령줄 구문 분석 라이브러리가 있으며 유사한 방식으로 구문 분석을 수행할 가능성이 높습니다.

이러한 라이브러리 루틴 getoptgetopt유사한 라이브러리 루틴 중 일부는 "긴" 옵션도 처리합니다. 이것들은 모두대개이중 대시( ) 앞에 인수를 허용하는 긴 옵션은 일반적으로 --유틸리티 (일부 구현) --block-size=SIZE에 대한 옵션 ( 동일한 지정 du도 허용 )과 같이 등호가 앞에옵니다.-B SIZE

매뉴얼에서 종종 짧은 옵션과 인수 사이에 공백을 표시하는 이유는 아마도 가독성 때문일 것입니다.

편집하다:진짜이전 도구(예 dd: tar유틸리티)에 대한 옵션 앞에는 대시가 없습니다. 이는 순전히 역사적인 이유와 이러한 방식으로 작동하는 소프트웨어와의 호환성을 유지하기 위한 것입니다. tar최근 유틸리티에서는 옵션에 대시를 사용할 수 있게 되었습니다. BSD 매뉴얼 tar에서는 이전 스타일 옵션을 "번들 플래그"라고 부릅니다.

답변2

xargsPOSIX 유틸리티 중 하나입니다. @drewbenn이 언급했듯이 POSIX는 옵션 구문 분석 동작을 문서화합니다.최대유틸리티 일치getopt, 다른 구현에 대한 일부 허용과 함께 다음과 같이 말합니다.12.1 실제 매개변수 구문:

이 섹션에서는 표준 유틸리티의 매개변수 구문을 설명하고 유틸리티에서 처리하는 매개변수를 설명하기 위해 POSIX.1-2008 전체에서 사용되는 용어를 소개합니다.

POSIX.1-2008에서는 유틸리티 매개변수의 구문을 설명하기 위해 특수 기호가 사용됩니다.달리 명시하지 않는 한, 모든 유틸리티 설명은 이 표기법을 사용하며 이 예에서는 이를 설명합니다(XCU 참조).간단한 명령):

그리고 결론을 내린다

향후 모든 유틸리티와 애플리케이션에서는 사용자 이식성을 향상시키기 위해 이 지침을 사용하는 것이 좋습니다. 일부 과거 유틸리티를 변경할 수 없다는 사실(기존 애플리케이션 중단을 방지하기 위해)이 향후 목표를 방해해서는 안 됩니다.

POSIX에서는(가장 일반적으로 사용되는 유틸리티만 다룬다는 점을 기억하세요) 피연산자 전달에 대한 예외가 있습니다.옵션다른 유틸리티 중에서위치상의매개변수 또는 인수특수 구문:

POSIX는 허용합니다임의로 선택할 수 있는옵션 값:

옵션 매개변수가 선택사항임을 나타내기 위해 옵션 매개변수가 앰퍼샌드 <blank>로 묶이지 않는 한 옵션 매개변수는 options 와 문자로 구분됩니다 .'['']'

어떤 POSIX 유틸리티가 이 기능을 사용하는지 기억이 나지 않습니다. 저주tic그리고infocmp유틸리티 회사는 이 기능을 다음 용도로 사용합니다.수준-v(상세/디버그) 옵션.

귀하가 묻는 구체적인 질문은 단락의 나머지 부분에 여러 줄에 걸쳐 자세히 설명되어 있습니다.

POSIX 이전에는 ps일부 구현에서는 하이픈 없이 옵션을 허용했습니다. POSIX 설명에서는 유틸리티 설명이나 구문 근거에서 이에 대해 언급하지 않습니다.

POSIX 외에도 긴 옵션 구현이 있습니다(예: GNU선택 항목을 길게 가져옵니다., 또는X 툴킷), 옵션의 값을 옵션에 분리하거나 연결하는 다양한 방법을 사용합니다. 예를 들어 구두점을 사용할 수 있습니다.

--option=value
--option value

구현에 따라 긴 옵션과 짧은 옵션(getopt)을 구별하기 위해 이중 대시를 사용할 수도 있고 사용하지 않을 수도 있습니다.살쾡이X 툴킷은 단일 대시를 사용합니다. 예를 들어 GNU는 getopt_long이중 대시를 사용합니다. 또한 a를 +사용하여 옵션이 무효화되었음을 나타낼 수 있습니다.

POSIX 설명에는 이들 중 어떤 것도 언급되지 않은 것 같지만 확실히 이러한 문제가 발생할 수 있습니다.

관련 정보