콘솔 응용 프로그램이 다음 중 하나로 인수를 시작하는 이유는 무엇입니까?
a) one dash (myapp -arg1 123; ls -al)
b) two dashes (myapp --arg1 123; git push origin master --force)
c) without dashes at all (myapp 123; man ls)
d) without dashes but with the equal sign (myapp arg1=123; dd if=/dev/zero)
표준 협약이 없나요? 표준 Linux 애플리케이션에서도 세 가지 경우 a), b) 및 d)가 동시에 존재합니다. 그리고 언제 -help를 사용해야 하는지, 언제 --help를 사용해야 하는지 기억하기 어렵습니다.
답변1
대시는 다음을 나타내는 데 사용됩니다.옵션, 이는 명령의 동작을 수정합니다. 대시가 없는 인수는 명령의 주요 매개변수를 나타내며, 파일 이름인 경우가 많습니다.
단일 하이픈은 일반적으로 단 하나의 문자로 구성된 옵션을 나타냅니다. 이러한 여러 옵션을 함께 그룹화할 수 있으므로 ls -a -l
로 축약할 수 있습니다 ls -al
. 이는 대부분의 초기 Unix 명령에 대한 표준 규칙이었습니다.
이중 하이픈은 전체 단어인 옵션을 소개합니다. 이 규칙은 위에서 설명한 그룹화와 구별하기 위해 필요합니다. 이 옵션 스타일은 유틸리티의 GNU 버전에서 대중화되었습니다. 그 이유는 기능이 너무 많아서 니모닉 한 글자가 부족한 경우가 많았기 때문입니다.
옵션에 자체 매개변수가 필요한 경우도 있습니다. 스타일은 다양합니다. 일부 명령은 use -o parameter
, 일부는 use -oparameter
, 일부는 use --option=parameter
, 일부는 여러 형식을 허용합니다.
또한 자신만의 이데올로기적인 인수 스타일을 고안한 소수의 명령도 있습니다. 이는 일반적으로 인수 규칙에 대한 합의가 이루어지기 전의 매우 오래된 명령입니다. 이에 대한 예는 tar
및 입니다 dd
. 규칙이 만들어지기 find
전에 전체 단어 옵션을 사용한 이전 명령이라는 점에서도 이례적입니다 . --
그 요구 사항이 일반적인 패러다임에 맞지 않기 때문에 그 주장은 사실상 그 자체의 언어입니다 command -options parameters
.
명령이 달라지는 또 다른 이유는 Unix에 원래 인수 구문 분석 라이브러리 기능이 없었기 때문입니다. getopt
및 getopts
기능이 생성된 것은 수명이 다 되어서야였습니다 . 이러한 라이브러리를 사용하면 기본적으로 일반적인 관행을 따라야 합니다. 그러나 오래된 프로그램은 자체적으로 임시 인수 구문 분석을 수행했으며 프로그래머마다 다른 결정을 내렸습니다.
답변2
@Barmar는 정확하지만 몇 가지 정보가 누락되었습니다. 실제로 이런 일이 발생하는 이유는 전적으로 프로그램의 코드가 작성된 방식, 더 구체적으로 인수를 구문 분석하는 데 사용된 코드 때문입니다.
이에 대해 더 이야기하기 전에 몇 가지 용어를 정리하고 싶습니다. 우선, "옵션"이라고 부르는 것도 실제로는 인수이기도 합니다. 실제로 명령줄에 입력하는 모든 것은 인수입니다(프로그램 이름 포함). 그런 다음 이러한 인수는 일반적으로 배열( argv
C에서 호출됨)에 저장됩니다. 그런 다음 프로그램은 이러한 인수를 구문 분석하는 방법(또는 구문 분석하는 경우)을 선택하고 그에 따라 동작합니다. 이제 인수는 일반적으로 세 가지 형태 중 하나를 취합니다.
- 플래그(인수를 사용하지 말고 단순히 동작을 켜거나 끄세요)
- 스위치(인수를 취하고 인수에 따라 동작 수정)
- 매개변수(동작을 수정하기 위한 것이 아닌 일반 데이터)
1
종종 프로그램 동작을 변경하기 위한 2
것으로 언급되지만 OPTIONS
둘 다 서로 다른 스타일로 나타납니다(Barmar도 언급함). C의 getopt
라이브러리는 실제로 이 영역에서 상당한 유연성을 허용합니다. 관례는 단일 하이픈이 앞에 오는 단일 문자 또는 두 개의 하이픈이 앞에 오는 전체 단어로 옵션을 지정하도록 하는 것이지만, 로 작성된 프로그램은 getopt
실제로 다음 중 하나가 동등한 것을 허용합니다( 색인으로 help
제공된다고 가정). h
):
-h
,--h
,--help
그러나 -help
실제로는 허용되지 않습니다 getopt
. 따라서 도구가 -help
해당 사용 플래그를 사용하는 경우 해당 도구가 라이브러리로 작성되지 않았음을 확신할 수 있습니다 getopt
. 이는 getopt
단일 하이픈을 해석하여 결합된 옵션 목록을 나타내므로 다음 -help
과 같이 해석되기 때문입니다 -h -e -l -p
.
또한 옵션이 인수(일반적으로 “optargs”라고 함)를 취하는 경우 이를 지정할 수 있는 몇 가지 방법이 있습니다. 다음은 에 대한 인덱스가 다음과 같다고 가정할 opt
때 o
,그리고 그것은 opt
optarg가 필요합니다¹—모두 동일합니다.
-oParameter
,-o Parameter
,--opt=Parameter
,--opt Parameter
라이브러리는 getopt
현재 널리 사용되는 표준이지만 이보다 이전 버전의 많은 도구(예: tar
)는 여전히 자체 구문 분석 설정을 사용하므로 는 와 tar -xjf
동일합니다 tar xjf
.
TL;DR: getopt
항상 존재하지 않았기 때문에 프로그래머는 인수를 자신만의 방식으로 구문 분석해야 했습니다. 그러나 최신 도구에서는 일반적으로 이를 사용하므로 동작이 정상적이고 예측 가능합니다.
1 optarg를 사용할 수 있지만 그렇지 않은 옵션을 갖는 기능이 잘 문서화되어 있지 않습니다.필요하다하나. 선택적 optargs는 모든 종류의 성가신 일을 일으키고 옵션을 지정하는 보다 일반적인 방법 중 일부를 유효하지 않게 만듭니다(모호하므로). 다행스럽게도 선택적 인수를 취하는 인수는 그리 흔하지 않습니다.
답변3
옵션은 대시로 시작하며 일반적으로 한 글자, 여러 옵션을 지정할 수 있습니다.
ls -l -h
or
ls -lh
옵션은 두 개의 대시로 시작하며 일반적으로 단어를 사용하며 여러 옵션은 작동할 수 없습니다.
ls --list --human