단일 문자 옵션의 경우 단일 대시`-`, 단어의 경우 이중 대시`--`?


51

문자에 단일 대시를 사용하고 단어에 이중 대시를 사용하는 규칙은 어디서 왔으며 왜 계속 사용됩니까?

예를 들어 입력 ls --help하면 다음과 같이 표시됩니다.

  -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 ~
...

나는 - and -- convention작은 성공으로 따옴표로도 인터넷 검색을 시도했습니다 .


6
여기서는 까다 롭지 만 캐릭터 -는 기술적으로 하이픈 이라고합니다 . 대부분의 경우 em 대시 (—), 때로는 en 대시 (–)를 나타 내기 위해 "dash"라는 단어를 사용하지만 둘 다 하이픈 (-)이 아닙니다.
chharvey 2016 년

4
잘 알려진 프로그램이 컨벤션을 따르지 않으면 정말 짜증납니다.java -version
Kimberly W

4
@Jamil 그래. 나는 그것이 왜인지 궁금하게 여기에서 끝났다find . -delete
Krzysztof Wende

같은 당신이 일을 쓸 수 있도록이의 아이디어는 -ab모두 활성화되는 ab. 이중 대시없이 -help활성화 것 h, e, l, 및 p옵션.
Aaron Franke

답변:


61

에서 유닉스 프로그래밍의 예술 이 실제로 어떻게 진화 해 왔는가에 에릭 스티븐 레이몬드 설명 :

원래의 유닉스 전통에서 명령 행 옵션은 단일 문자 앞에 하이픈이 붙습니다. 원래의 유닉스 스타일은 느린 ASR-33 텔레타이프에서 발전하여 간결함을 미덕으로 만들었습니다. 따라서 단일 문자 옵션. Shift 키를 누르면 실제 노력이 필요했습니다. 따라서 소문자를 선호하고 옵션을 활성화하기 위해 "-"(아마도 더 논리적 인 "+"대신)를 사용합니다.

GNU 스타일은 키워드 문자 대신 옵션 키워드 앞에 두 개의 하이픈을 사용합니다. 몇 년 후 다소 정교한 GNU 유틸리티 중 일부가 단일 문자 옵션 키가 부족해지기 시작했을 때 진화했습니다 ( 이것은 기본 질병의 치료제가 아니라 증상의 패치가되었습니다 ). GNU 옵션은 이전 스타일의 알파벳 수프보다 읽기 쉽기 때문에 인기가 있습니다. 1

[1] http://www.faqs.org/docs/artu/ch10s05.html


getopt ()는 1985 년에 처음 게시되었지만 UNOS (가장 오래된 UNIX 복제본)는 1982 년에 getargs ()를 이미 게시 (1980 년에 작성)했으며 getargs ()는 짧은 옵션과 단일 대시 긴 옵션 (Multics 스타일)을 지원합니다. UNOS는 단일 대시 길이 옵션을 대규모로 사용했으며 UNOS는 전 AT & T 직원이 작성했습니다. 1988 년에 GNU는 단일 대시 길이 옵션이 훌륭하게 작동한다고 UNOS가 확인했지만 이중 대시 길이 옵션을 제공했습니다.
schily

28

단일 문자 옵션을 계속 사용하는 한 가지 이유는 그들이 함께 중독 될 수 있기 때문이다 : ls -ltrA는 많은 것보다 입력하기 쉽게 ls --sort=time --reverse --format=long. 둘 다 사용하기 좋은 경우가 많습니다. 이 주제를 검색하려면 "유닉스 명령 행 옵션 규칙"을 시도하십시오.


1
+1 감사합니다. 구현의 논리에 도움이됩니다.
Larry

유닉스는 이해하지 못하기 ls --sort=time --reverse --format=long때문에이 비표준 방법을 언급하는 것도 좋은 생각이 아닙니다.
schily

6

레이몬드에서 인용 @jasonwryan에 의해 몇 가지 유용한 정보를 가지고 있지만, 이야기의 중간에 시작 :

  • Unix는 축소 된 Multics 버전으로 시작했으며, 그 동안 Unix의 기능은 종종 다른 시스템에서 보거나 사용 된 기능의 모방 또는 개조였습니다.
  • '-'옵션 문자는 멀 틱스에 사용되었다. Bitsavers에는 사용자 명령에 대한 매뉴얼이 있습니다 .
  • 다른 시스템은 다른 문자를 사용했으며 일부는 키 입력 효율성이 더 높으며 (예 : '/'TOPS 및 VMS에 사용) 일부 '('는 (VM / SP CMS에 사용되는) 더 적은 문자 를 사용했습니다.
  • Multics 옵션 은 여러 문자로 구성되었습니다 (예 : 밑줄로 분리 된 키워드).
  • Longs Multics 옵션은 -printvs -pr(3-8 페이지) 와 같이 짧고 축약 된 형태 인 경우가 많습니다 .
  • 유닉스 옵션은 단일 문자 getopt였으며 몇 년 후 소개되었습니다. 원래 유닉스에 포함되지 않았기 때문에 사용하지 않고 getopt그대로 남겨진 유틸리티 가 있습니다. 그러나 getopt프로그램 일관성을 유지하는 데 도움이되었습니다.

반면, 유닉스 옵션 getopt은 단일 문자였습니다. 다른 시스템, 특히 더 큰 시스템에서는 키워드가 사용되었습니다. 일부 (모두는 아님)로 해당 키워드를 축약 할 수있었습니다 . 즉, 옵션이 명확하지 않은 한 모든 문자가 제공되는 것은 아닙니다. 모호성에 대한 테스트에는 함정이 있습니다. 예를 들면 다음과 같습니다.

  • 1985 년 초, 저는 PrimOS 로 포팅 해야하는 프로그램을 진행하고있었습니다 . Prime의 개발자는 서로 다른 언어를 모방 한 명령 언어를 제공하여 각기 다른 회사와 경쟁했습니다. 물론 VMS처럼 약어를 지원했습니다. 온라인 도움말을 읽은 후을 입력 sta하고 싶었 습니다 status. 그것은의 약어였으며 시작할start 것도 아무것도주지 않았으므로 명령 통역사가 저를 로그 오프했습니다.
  • X 툴킷 ( xterm에 의해 사용 )은 약식 옵션을 허용합니다. xterm에서이를 효과적으로 사용하려면 명령 매개 변수를 사전 처리하여 -v(버전의 경우)보다 -vb(비주얼 벨) 선호해야합니다 . X 툴킷은 모호성이있을 때 선호하는 옵션을 직접 지정할 수있는 방법이 없습니다.

이러한 모호한 가능성으로 인해 일부 개발자는 약어를 허용하지 않는 것을 선호합니다. 예를 들어 Lynx 는 약어를 허용하지 않고 여러 문자 옵션을 사용합니다.

모든 프로그램은 사용 getopt: tarps하지 않았다. 대시가 선택적인 위치와 옵션 값이 선택적인 부분을 기록하여 알 수 있듯이 rcs(또는 sccs) 도 아닙니다 .

이 모든 것을 고려하여 GNU 개발자 getopt는 각 짧은 옵션의 긴 버전을 제공하도록 확장 하여 다른 시스템에서 사용되는 키워드 옵션을 조정했습니다 . 예를 들어 textutils 1.0 changelog는

Tue May  8 03:41:42 1990  David J. MacKenzie  (djm at abyss)

        * tac.c: Use regular expressions as the record boundaries.
        Give better error messages.
        Reformat code and make it more readable.
        (main): Use getopt_long to parse options.

fileutils의 변화는 이전에있었습니다 :

Tue Oct 31 02:03:32 1989  David J. MacKenzie  (djm at spiff)

        * ls.c (decode_switches): Add long options, using getopt_long
        instead of getopt.

누군가가 여전히 더 일찍 찾을 수 있지만 파일 헤더에 가장 빠른 날짜가 표시되는 것 같습니다.

/* Getopt for GNU.
   Copyright (C) 1987, 1989 Free Software Foundation, Inc.

예를 들어 X Toolkit (1987)과 동시에 사용됩니다. 당신이 (같은 익숙한 유닉스 유틸리티의 대부분은 ls, ps) 매뉴얼에주기적인 방문을 필요로하는 기존의 단일 문자 옵션을 사용했다. 을 소개 할 때 getopt_longGNU 개발자는 먼저 새로운 옵션을 추가 하여이 작업을 수행하지 않았습니다 . 기존 옵션을 표로 작성하고 일치하는 긴 옵션을 제공하는 것으로 시작했습니다 .

이들이 기존 레퍼토리에 추가 했기 때문에 기존 옵션과의 충돌 문제가 다시 발생했습니다. 이를 피하기 위해 긴 옵션 앞에 두 개의 대시를 사용하여 구문을 변경했습니다.

이러한 프로그램은 getopt_long일반적인 이유로이 방식으로 계속 사용 됩니다.

  • 스크립트는 옵션에 따라 다릅니다. 개발자는 스크립트를 깨뜨리고 싶어하지 않습니다
  • 서면 코딩 표준 이 있습니다 (유효 할 수 있음)
  • BSD와 GNU 개발자가 서로 옵션 이름을 복사하는 것은 명백히 호환되지 않는 경쟁 도구 세트를 만든 사람이 없습니다.

3

wikipedia 명령 행 인터페이스에서 다음과 같이보고됩니다.

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


이것은 컨벤션이 어디서 왔으며 왜 계속 사용되는지에 대한 질문에는 대답하지 않습니다.
chharvey 2016 년

1

내 생각에 더 설명적인 옵션이 필요하고 더 긴 옵션을 사용하면 단일 문자 옵션이 부족할 염려가 없습니다.

긴 옵션을 원하면 적어도 긴 옵션과 짧은 옵션을 모두 지원할 계획이라면 문제가 있습니다. 나는 긍정적이지 않지만 arcege의 대답이 왜 그리고-에 대한 열쇠를 가지고 있다고 생각합니다. 일반적인 처리 루틴 (예 : getopt_long ()은 단일 명령 행 인수에 여러 옵션이 포함될 수 있는지 여부를 알아야합니다. -ltr. 따라서 처리 루틴은이 둘을 구별 할 수 있어야합니다. 단일 대시--를 읽으면 나머지 명령 줄 인수가 여러 옵션과 일치 할 수 있습니다. 이중 대시-를 읽으면 나머지 명령 줄 인수는 단일 옵션과 일치해야합니다.

최근에 getopt_long ()을 사용했으며 기억하기 쉽고 자체 문서화가 쉬워 긴 옵션을 좋아하기 시작했습니다. 다음 두 명령이있는 경우 :

./ 집 계기 -f 15

./aggregator-세척 시간 15

긴 옵션을 사용하는 두 번째 방법은 더 자명하다고 말합니다.


0

두 가지 방법을 사용하는 데는 몇 가지 이유가있을 수 있습니다. 물론 하나는 전통입니다. 프로그래머와 사용자는 인간이며 인간은 일이 특정 방식으로 작동하기를 기대합니다. 변경할 이유가없는 경우 (그리고 실제로는 명령 줄의 경우 변경할 이유가 많지 않은 경우) 변경하지 마십시오.

즉, 긴 옵션으로 단일 하이픈을 사용하거나 하이픈을 완전히 제거하는 도구가 있다는 것을 알고 있습니다. 이러한 도구는 처음에는 어려울 수 있으며 다른 통일 된 시스템에서 사마귀로 튀어 나오는 경향이 있습니다.

두 가지의 차이점을 배우고 두 번째 특성이되기 전에는 "short"하이픈이 "short"옵션과 일치하고 "long"(또는 이중) 하이픈은 "long"과 일치한다는 것을 항상 기억합니다. 옵션. 그 추론이 이중 하이픈 스타일의 개발에 사용되었는지는 알 수 없지만 가능합니다.

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