명령 프롬프트 매개 변수에 대한 1 대시와 2 대시의 차이점은 무엇입니까?


65

일부 프로그램에서 명령 프롬프트 매개 변수가 앞에 두 개의 대시 가 있어야 하는 반면 일부 (대부분) 에는 앞에 하나의 대시 만 필요하다는 것이 궁금합니다.

예를 들어 대부분의 프로그램은 다음과 같습니다. relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

일부 프로그램은 다음과 같습니다. xmllint --valid toc.xml --noout

어떤 것이 하나 대신 두 개의 대시를 요구하는 이유는 무엇입니까? 모든 사람이 하나의 표준을 준수 하는 것이 합리적이지 않습니다 (즉, 단일 대시가 수행함).


10
> 모든 사람이 하나의 표준을 고수하는 것은 합리적이지 않습니다 . 모든 프로그래머가 표준을 준수하고 일관성을 유지합니까? 아니 많은 프로그래머도 내에서 일관성을 유지할 수없는 자신의 프로그램 :) 말했다되는 것을, 합의는 하나의 문자 옵션에 대한 하나 명의 대시, 실제로 예를 들어 단어입니다 모든에 대한 두 개의 대시 사용하는 것입니다 -i--input또는 -n --dry-run.
slhck

1
그 규칙에 도움을 Heys 덕분에 =) @slhck, 그것은이 있음을 의미합니까 -dtd정말 있었어야 --dtd? 실제로 내가 궁금했던 것은 대시 (및 이중 대시)가 무엇 의미 하려고 합니까?
Pacerier

6
보너스 포인트 : Gnu 표준을 준수하는 프로그램 --long-options은 고유 한 약어도 허용합니다. 그래서 옵션이있는 프로그램 --file-in--file-out, 당신이 사용할 수 --file-o=foo또는 --file-i=foo몇 가지 입력을 저장할 수있는 --very-long-optional-parameters.
BRPocock

GNU는 X 윈도우 시스템뿐만 아니라, ImageMagick과 함께 번들로 제공 것과 내가 좋아하는 일 "긴"옵션,하지만, 많은 나이 유틸리티에 대한 두 개의 대시를 사용하여 자신의 규칙과 함께 온에게 ( 예 : , convert, mogrify)가 "긴" 단일 대시 만 사용하는 옵션. 예를 들면 다음과 같습니다 xterm -fn 6x10 -geometry 80x24+30+200.. 약어는 지원 그들이 (별개있어 제공되는 예를 들어 , -g또는 -geom에 대한 -geometry). 다른 예는 X (7) 을 참조하십시오 .
TheDudeAbides

답변:


18

그냥 ls --help 옵션을 보라. 그것은 당신에게 분명해야합니다.

매개 변수와 전혀 관련이 없습니다. 많은 옵션은 짧은 형식과 긴 형식을 가지며, 많은 옵션은 하나만 있고 다른 것은 아닙니다.

또한 매개 변수와 관련하여 매개 변수를 취할 때 긴 형식에서는 항상 같음과 같습니다. 그러나 분명히 짧은 것은 매개 변수를 많이 가질 수 있습니다. 그들은 평등을 사용하지 않습니다.

다음은 추출 내용입니다 ls --help( man ls동등한 정보 제공). 일부는 짧은 형식 (없이 긴 양식을 얼마나 주목 --author, --block-size), 일부는 긴 형식 (하지 않고 짧은 형식이 -c, -f,을 -g), 일부는 긴 형식과 짧은 형식 (모두가 -A/ --almost-all, -b/을 --escape).

 -a, --all                  do not ignore entries starting with .
 -A, --almost-all           do not list implied . and ..
     --author               with -l, print the author of each file
 -b, --escape               print octal escapes for nongraphic characters
     --block-size=SIZE      use SIZE-byte blocks
 -B, --ignore-backups       do not list implied entries ending with ~
 -c                         with -lt: sort by, and show, ctime (time of last
                              modification of file status information)
                              with -l: show ctime and sort by name
                              otherwise: sort by ctime
 -C                         list entries by columns
     --color[=WHEN]         control whether color is used to distinguish file
                              types.  WHEN may be `never', `always', or `auto'

4
ls --help창문에서 어떻게해야 합니까?
Pacerier

1
@Pacerier lsWindows 에는 없습니다 . 동등한 명령은입니다 dir /?. 일반적인 Windows 규칙을 위반하는 크로스 플랫폼 소프트웨어를 사용하고 있습니다. 내 대답을 참조하십시오.
Daniel Beck

@Pacerier 내장되어 있지 않지만 타사, Gnuwin32를 다운로드하십시오 (Google gnuwin32). gnuwin32에는 각각 명령이있는 많은 패키지가 있으며, 많은 공통 명령이있는 coreutils 패키지를 다운로드하십시오.
barlop

ls --help발췌 부분에 짧은 옵션이없는 긴 옵션이 있습니다 . 참조 --author--block-size.
Dan

@Pacerier의 원래 의견에서 질문에 대답하려면 : 현대 Windows 시스템이 ls명령을 얻는 가장 일반적인 방법 은 GIT 입니다. PATH에 GIT bin이있는 GIT bash 쉘 또는 CMD 창에는 다음이 있습니다 ls.
yzorg 's

34

광범위한 표준이 없습니다. 예를 들어 GNU 프로그램에는 일관성이 있지만 각 프로그램의 설명서를 확인해야합니다.

인용 위키 백과 , 강조 광산 :

유닉스 계열 시스템 에서 ASCII 하이픈-마이너스는 일반적으로 옵션을 지정하는 데 사용됩니다. 문자 뒤에 보통 하나 이상의 문자가옵니다 . 문자가없는 단일 하이픈 빼기 인수는 일반적으로 프로그램이 표준 입력에서 오는 데이터를 처리하거나 표준 출력으로 데이터를 보내도록 지정합니다. 일부 프로그램에서는보다 설명적인 옵션 이름이 사용되는 "긴 옵션"을 지정하기 위해 두 개의 하이픈 (-) 문자 (-)가 사용됩니다 . 이것은 GNU 소프트웨어의 일반적인 기능입니다.

일반적으로 하이픈은 미리 정의 된 인수를 나타냅니다. 파일 이름이나 인수로 사용할 수있는 다른 레이블과 구별하기 위해 사용 된 것 같습니다. 그러나 항상 그런 것은 아닙니다 (아래 참조).


ls 와 같이 짧은 옵션과 긴 옵션 모두에서 동일한 인수를 사용할 수 있습니다 .

일부 프로그램은 한 문자 옵션에 단일 하이픈을 사용하고 여러 문자 옵션에 두 개의 하이픈을 사용하지만 전부는 아닙니다 (GNU find가 떠 오릅니다). 일부 프로그램에는 선택적인 하이픈이 있거나 생략되어 있습니다 ( tar또는 BSD ps가 떠 오릅니다).

때로는 긴 옵션 ( --foo)에는 인수가 필요하지만 짧은 옵션 ( -f)에는 필요하지 않습니다 (또는 적어도 특정 기본 인수를 암시).

짧은 옵션 (예 :) cut -d ' '에는 인수가있을 수 있지만 긴 옵션 (예 ls --all:)에는 반드시 필요한 것은 아닙니다.

프로그램의 특정 동작을 설정하려면 때로는 짧은 옵션을 사용해야하고, 다른 경우에는 긴 옵션을 사용해야하며 일부는 선택할 수 있습니다.

관련 메모에서 일부 프로그램은 옵션과 인수 사이의 공백을 처리 할 수 없고 다른 프로그램은 공백을 처리 할 수 없습니다.

처음에 썼 듯이 일반적인 행동이나 표준은 없습니다. 인수 구문 분석에 사용 된 동일한 라이브러리와 유사한 동작을 추적 할 수 있지만 소스를 읽고 싶지 않은 경우가 있습니다.

한 프로그램의 인수 구문을 다른 프로그램의 인수 구문에서 실제로 유추 할 수는 없습니다.


Windows를 고려한다면, 훨씬 더 나빠집니다. Windows 명령 행은 일반적으로 옵션과 그 값 사이의 구분 기호 (예 : 여기 참조)와 /f함께 옵션에 대해 (적어도 대부분의 단일 문자)를 사용합니다 . 크로스 플랫폼 유틸리티는 (예를 들어 언급 한 것과 같이) 널리 퍼져 있으며 위에서 언급 한 모든 불일치와 함께 인수에 대한 일반적인 하이픈 구문을 제공합니다.:


2
GNU 표준 라이브러리는 1- 마이너스 1 문자, 2- 마이너스 다중 문자 옵션을 매핑하는 기능을 제공하므로 모든 새로운 GNU 프로그램 및 대부분의 무료 소프트웨어는 일반적으로이 표기법을 사용합니다 (예 :- f, -f foo, --file, --file foo, --file = foo, --fil = foo, --fi = foo); 같은 고령화 tar, ps, find이 표준이 완전히 겔화되기 전에 POSIX에 의해 설정 등이 있었다 자신의 명령 줄 구문. GNU / 리눅스 시스템에서, 그것은이다 합리적으로 이상이 있다는 안전한 내기 --help(거의) 항상 지원 될 것이다뿐만 아니라, man <command>또는info <command>
BRPocock

GNU 표준에 따르면 긴 형식이 없으면 짧은 형식이 아니어야하고 짧은 형식이없는 긴 형식이 아니어야합니까?
barlop

find긴 옵션에 대해 "GNU 규칙"을 따르지 않는 GNU에 대한 언급을 포함하여 가장 완전한 답인 +1 (@BRPocock이 지적한 POSIX 준수의 이유로). OP의 질문에 "windows"라는 태그가 붙어 있기 때문에 DOS / Windows 명령 줄 "스위치"를 언급 할 수 있다면 다시 +1하고, 그 규칙은 완전성을 위해 언급해야합니다.
TheDudeAbides

7

이것은 * nix에서 나온 협약입니다. 이중 하이픈은 옵션 이 전체 로 작성 될 때 옵션보다 우선 하고, 단일 하이픈 은 짧은 형식 으로 작성 될 때 옵션이 우선 합니다 . 예를 들어 ls --all --l, 단축 할 수 있습니다 ls -al. 보다시피, 일반적으로 사용되는 옵션이 많지만 모든 옵션에 해당하는 단일 문자가있는 것은 아닙니다.

옵션이 인수를 취하는 지 여부는 실제로 차이를 만들지 않습니다. 옵션을 입력하는 방식에 관계없이 옵션을 가져 오거나 가져 오지 않을 수 있습니다.

한 번만 사용하도록 쓸 때는 실제로 중요하지 않지만 .alias 파일과 같은 명령을 쓸 때는 전체 형식을 사용하는 것이 일반적입니다. 다음 사람이 쉽게 읽을 수 있도록


도움을 주셔서 감사합니다. Btw가 유닉스를 * nix로 입력하는 이유가 있습니까?
Pacerier

2
@Pacerier-Unix는 상표명입니다. * nix를 입력함으로써 실제로 모든 유닉스 및 유사한 시스템을 언급하는데, 이는 실제적인 목적으로 동일합니다. 그러나 대부분, 그것은 습관의 힘입니다 ...
Rook

2
@Pacerier * nix는 Linux 또는 Unix를 나타낼 수 있습니다. 나는이 cos가 내가 그것을 조사 한 시간이 었는지 완전히 확신하지는 못하지만 기술적으로 BSD는 Unix 제품군에서 나온 것입니다. 리눅스는 기술적으로도 .. 그리고 FreeBSD도 아닙니다. 그러나 * nix라고 말하면 유닉스 / bsd와 리눅스 및 freebsd와 같은 것이 포함됩니다.
barlop

2
속기 명령 결합에 대해 +1 그 진짜 이유 두 가지 스타일이 있습니다.
Ryan_S

3

이것들은 일반적인 UNIX 문법입니다.

프로그램 인수는 간단한 옵션 인 경우 하나의 하이픈 ( "-")과 단일 문자 (예 : -v )와 옵션이 인수 인 경우 두 개의 하이픈 ( "-")을 사용합니다 (예 : --file toc.xml 또는 --file = toc.xml )

프로그램 기능에 영향을 미치지 않습니다.


3
또한 단일 대시 뒤에 단일 문자 옵션이있는 경우 대부분 문자를 그룹화 할 수 있습니다. 예를 들어 "ls -al"은 "ls -a -l"과 동일합니다. 이중 대시 옵션은이 방법으로 결합 할 수 없습니다. 단일 문자 옵션은 더 오래된 표준이지만 요즘에는 많은 명령이 두 가지 유형을 모두 사용합니다. 예를 들어 "ls --all"은 "ls -a"와 같습니다.
랜디 올리 슨

3
사실, 또 다른 수정. 단일 대시 단일 문자 옵션은 매개 변수를 사용할 수 있지만 일반적으로 등호와 연결되어 있지 않습니다. 예를 들어, "tail -n 50"은 "tail --lines = 50"과 같은 파일의 마지막 50 줄을 보여줍니다.
랜디 올리 슨

이 규칙에 따르면 --noout(위의 질문에서) 인수-noout 가 없기 때문에 실제로 작성되어야 한다는 것을 의미 합니까?
Pacerier

1
이 답변에서 매개 변수에 대해 말한 것은 완전히 잘못되었습니다. 첫 문장은 분명하다. 마지막 문장은 분명하다. 그리고 질문에 대답해야 할 중간의 단락은 완전히 잘못되었습니다.
barlop

@RandyOrrison 하나의 문자가 내가 등호를 본 적이 없을 때 .. 그리고 당신의 요점을 자세히 설명하기 위해, 그들은 종종 매개 변수를 취합니다. wget -w 10 head -n 3 cut -b 2 그리고 Ping-? !! 하중에는 매개 변수가 사용됩니다. 이 답변은 끔찍합니다
barlop

3

단일 대시는 getopt에 의해 구현되며 posix 표준 함수, getopt_long의 이중 대시이며 gnu 표준입니다.

전통적으로 단일 대시는 다음과 같은 단일 문자 옵션을 제공합니다.

-A 또는 -V 등으로 제한되지는 않습니다. 예를 들어 gcc의 -Wall은 gcc 컴파일러 명령에 대한 모든 컴파일러 경고를 켭니다.

이중 대시 인수는보다 장황한 경향이 있으며 종종 --max-count = NUM과 같은 제공된 매개 변수를 사용합니다. 그러나 --version은 같지 않습니다.

일반적으로 말해서 프로그램 인수를 지정하는 방법에 대한 규칙이나 정의 된 표준은 없으며 많은 전통이 있습니다. 그러나 getopt 및 getopt_long 명령 행 구문 분석 기능이 사용되는 경우 라이브러리 기능이 특정 방식으로 수행하므로 매개 변수는 일반적으로 표준을 따라야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.