콘솔 애플리케이션이 다음과 같은 방법으로 매개변수를 가져오는 이유는 무엇입니까?
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 버전의 유틸리티에서 인기를 끌었습니다. 왜냐하면 단일 문자를 사용하여 니모닉하기에는 너무 많은 기능이 있기 때문입니다.
옵션에 자체 매개변수가 필요한 경우도 있습니다. 스타일은 다양합니다. 일부 명령은 -o parameter
, 일부는 사용 -oparameter
, 일부는 사용 --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가 필요합니다.1 - 또한 동일합니다:
-oParameter
,-o Parameter
,--opt=Parameter
,--opt Parameter
라이브러리는 현재 널리 사용되는 표준 이지만 getopt
이를 앞선 많은 도구( 예 tar
: .tar -xjf
tar xjf
긴 이야기 짧게: getopt
가 항상 존재하는 것은 아니므로 프로그래머는 자신만의 방식으로 인수를 구문 분석해야 합니다. 그러나 최신 도구에서는 일반적으로 이를 사용하므로 동작이 정상적이고 예측 가능합니다.
1 optarg를 허용하지만 허용하지 않는 옵션에 대한 문서화되지 않은 기능이 있습니다.필요하다하나. 선택적 optargs는 모든 종류의 성가신 일을 야기할 수 있으며 옵션을 지정하는 보다 일반적인 방법 중 일부가 유효하지 않게 만들 수 있습니다(모호하기 때문입니다). 다행히 선택적 인수를 사용하는 경우는 드뭅니다.
답변3
옵션은 대시로 시작하고 일반적으로 문자이며 여러 옵션을 지정할 수 있습니다.
ls -l -h
or
ls -lh
옵션은 두 개의 대시로 시작하며 일반적으로 단어로 시작되며 여러 옵션은 허용되지 않습니다.
ls --list --human