명령 행 옵션 스타일-POSIX 또는 무엇?


16

어딘가에서 Windows와 Unix 스타일의 혼합을 사용하여 java / javac에 대한 분노를 보았습니다.

java -classpath ... -ea ... Something

IMHO, 그것은 혼합이 아니며, 그것은 find작품과도 같지 않습니까? POSIX에 따르면 AFAIK 구문은 다음과 같아야합니다.

java --classpath ... --ea ... Something

그리고 -abcdef한 번에 6 짧은 옵션을 지정하는 것을 의미한다. 어떤 버전이 일반적으로 타이핑이 적고 오류가 적은지 궁금합니다.

Java로 작은 유틸리티를 작성하고 /a /b있으며 Unix에 주로 관심이 있기 때문에 Windows 스타일을 사용하지 않습니다 . 어떤 스타일을 선택해야합니까?


1
POSIX 1003.1-2003, 기본 정의, 12 장, 2 절은 유틸리티 명령 줄 구문에 대한 다음 지침을 제공합니다. "각 옵션 이름은 휴대용 문자 집합에서 단일 영숫자 문자 (순수 문자 분류) 여야합니다." "모든 옵션 앞에는 '-'구분 문자가 와야합니다."
Greg A. Woods

답변:


21

유틸리티 규칙 장 에서 POSIX 인수 규칙을 찾을 수 있습니다 . POSIX 스타일은 옵션과 공백으로 구분 된 인수 값과 함께 옵션을 나타내는 단일 문자 뒤에 단일 대시가있는 옵션으로 구성됩니다.

find예를 들어, 규칙에는 예외가 있지만 이는 유닉스의 역사적 선례 때문입니다.

X Windows (X11)는 find비슷한 단일 대시, 긴 이름 옵션을 사용합니다.

이중 대시 긴 이름 옵션은 +접두어로 사용하여 우회 한 후 GNU에 의해 개척되었습니다 .

알려진 다양한 명령 줄 인수 처리 시스템에 대한 자세한 내용은이 StackOverflow 질문을 참조하십시오 . ( 이 글이 쓰여진 이후로, 그 힘은 SO 367309가 SO에 적합하지 않다는 질문을 결정했습니다. 나는 다른 질문에 답을 옮겼습니다 . Unix 쉘 명령의 일반적인 구문은 무엇입니까? )

다음 git과 같은 구조를 갖는 기술 목록 과 기타 여러 시스템 을 확장 할 수 있습니다 .

  • basecommand[ 전역 옵션 ] subcommand[ 하위 명령 옵션 ] [이름 ...]

각각 자체 옵션 옵션이있는 많은 하위 명령이있을 수 있습니다.

물론, Windows는 /대시 ( ') 대신 옵션을 나타 내기 위해 슬래시 (')를 사용합니다 -.

JCL (z / OS 및 OS / 360 및 중간 시스템의 경우)은 쉼표로 구분 된 위치 매개 변수를 사용하는 경향이 있으며 일반적으로 사용자 친화적이거나 인터페이스가 좋지 않은 것으로 간주됩니다.


1
+1 멋진 링크와 언급 git.
maaartinus

나는 모든 답변을 좋아하고 링크 때문에 이것을 수락했습니다.
maaartinus

stackoverflow 질문이 삭제되었거나 이동 된 것 같습니다 ... 누군가가 어디로 갔는지 알고 있습니까? 나는 그것을 읽고 궁금하다.
mizipzor

1
@mizipzor : 정보의 현재 위치에 대한 업데이트를 참조하십시오. 옵션 인수가있는 짧거나 긴 옵션
Jonathan Leffler

"물론 Windows는 슬래시 '/'를 사용하여 대시 '-'대신 옵션을 나타냅니다." 대부분의 Windows 명령 줄 도구는 이제 두 가지를 모두 지원하며 PowerShell은 대시 만 사용합니다.
jpmc26

15

편집 : 이 스타일은 GNU-ism이며 GNU 기반이 아닌 Unix는 단일 대시 구문 (특히 OS X 및 BSD 변형)을 사용하는 경향이 있음이 지적되었습니다.

GNU-ism 상태이지만 새로 작성된 많은 유닉스 스타일 프로그램은이 스타일을 사용합니다.

  • --long-option 긴 옵션 이름의 경우
  • -s 짧은 (한 문자) 옵션의 경우
  • -abc 인수가없는 여러 개의 짧은 옵션 (옵션 당 하나의 문자)
  • 인수가있는 옵션 :
    • --long arg또는 --long=arg긴 옵션의 경우
    • -s arg, -sarg또는 (선택적으로) -s=arg짧은 옵션. 마지막 옵션 에만 인수가있는 한 다른 짧은 옵션과 함께 사용할 수 있습니다 .
  • 동일한 "의미 적"옵션은 여러 개의 별칭을 가질 수 있으며, 가장 일반적으로 짧고 (빠른 유형) 하나의 긴 (기억하기 쉬운) 별칭입니다.

일정 시간 동안 Linux 셸을 사용해 본 사람이라면이 스타일에 익숙해야합니다 1 . 긴 옵션으로 모호하지 않고 여러 개의 짧은 옵션을 그룹화하는 것도 좋습니다.

(1) 예를 들어, (내 리눅스 머신에)이 스타일을 사용하는 프로그램 중 일부는 : ls, grep, man, sed, bash, 등 ( 편집 : 다음은, BSD와 OS X 머신이이 스타일을 사용하지 않는하지만 분명히 GNU-ISMS 있습니다)

당신이 구문 분석을 돌볼 수있는 몇 가지 라이브러리가 있습니다 (가장되는 잘 알려진 GNU의 구현getopt는 ) 단지 길고 짧은 옵션들이 인수를 가지고 있는지, 존재와 때를 어떻게 수행 할 작업을 지정할 필요, 옵션이 발견되었습니다. (물론 위치 인수, 즉 -이전 옵션으로 시작하지 않고 이전 옵션에 대한 인수가 아닌 인수에 대해 수행 할 작업 )

find새로운 명령 행 구문을 사용하도록 쉽게 변경할 수없는 매우 오래된 프로그램 (또는 아마도 오래된 프로그램의 재 작성된 버전)입니다. 스크립트가 너무 많으면 기존 구문에 익숙한 사용자가 너무 많아서 불만을 나타냅니다. 역사적으로 인해 오래된 구문을 따르는 친구들과 javac영향을 받았을 가능성이 높습니다 gcc.


하나는 - 당신이 옵션의 수백이있는 경우 또한, 당신은 창의력을 (예를 들어 컴파일러를 작성할 때)
팀 포스트

1
모든 Unices가 GNU utils (즉, 대시-대시 인수)를 사용하고 있다는 잘못된 인상을줍니다. Mac OS X은 이들을 지원하지 않으며 Free BSD에도 동일하게 적용됩니다.
Martin Wickman

8
  • dash-dash ( --long-arg)를 사용한 인수 는 GNU 규칙입니다 ( getopt 구현 참조 ).
  • POSIX 명령은 이중 대시 인수를 사용하지 않습니다. 이것은 기본적으로 GNU를 사용하는 Linux를 제외한 대부분의 Unix 변형 (Mac OS X, BSD)에 적용됩니다.

자바 프로젝트의 경우, 체크 아웃 할 수 있습니다 Java 용 GNU의 getopt는을 하거나 아파치 CLI . 두 규칙을 모두 지원합니다.

세 번째 옵션은 Java VM 인수를 사용하여 런타임에서 사용자를 위해 구문 분석하도록하는 것입니다.

 $ java -Dcolor=blue

그리고 코드에서 :

 System.getProperty("color");

개인적으로, 나는 -D관용구를 사용하고 클래스 경로 검사 등 명령 줄 구문 분석을 처리하는 쉘 스크립트로 Java incantation을 래핑합니다. 또한 기본 사용자가 Java 프로그램을 쉽게 실행할 수 있습니다.


1

때에 따라 다르지. 개인적으로 POSIX 스타일을 선호하지만 귀하의 경우 귀하의 도구가 사용될 환경과의 일관성을 목표로 할 것입니다. 이는 JAR에 Java 규칙을 사용함을 의미합니다 (일반적인 Unix 명령처럼 보이게하는 랩퍼 스크립트를 계획하지 않는 한).

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