# 스크립트에서는 긴 옵션을 사용합시다

> Clean Markdown view of GeekNews topic #19905. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=19905](https://news.hada.io/topic?id=19905)
- GeekNews Markdown: [https://news.hada.io/topic/19905.md](https://news.hada.io/topic/19905.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-03-23T10:32:56+09:00
- Updated: 2025-03-23T10:32:56+09:00
- Original source: [matklad.github.io](https://matklad.github.io/2025/03/21/use-long-options-in-scripts.html)
- Points: 6
- Comments: 1

## Summary

많은 명령줄 유틸리티는 짧은 형식 옵션(-f)과 긴 형식 옵션(--force)을 지원하며, 스크립트에서는 긴 형식을 사용하는 것이 권장합니다. 긴 형식 옵션은 독자에게 더 설명적이기 때문에 스크립트에서 가독성을 높이는 데 유리합니다.

## Topic Body

- 많은 명령줄 유틸리티는 짧은 형식 옵션(`-f`)과 긴 형식 옵션(`--force`)을 지원함  
- 짧은 형식은 대화형 사용을 위한 것임, 스크립트에서는 긴 형식을 사용할 것을 권장함  
- 예를 들어, 터미널에서는 `$ git switch -c my-new-branch`라고 입력함.  
- 릴리스 스크립트에서는 다음과 같이 작성함:  
  - `try shell.exec("git fetch origin --quiet", .{});`  
  - `try shell.exec("git switch --create release-{today} origin/main", .{ .today = stdx.DateUTC.now() }, );`  
- 긴 형식 옵션은 독자에게 훨씬 더 설명적임

## Comments



### Comment 36235

- Author: neo
- Created: 2025-03-23T10:32:56+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=43440184) 
* 긴 옵션을 선호하지만, POSIX 명령을 이식성 있게 호출해야 할 때는 짧은 옵션만이 유일한 선택임. POSIX는 긴 옵션을 명시하지 않음
  - 예를 들어, diff의 사양을 참조할 수 있음
  - 대부분의 경우, POSIX 유틸리티에 의존하기보다는 라이브러리 바인딩을 사용하는 것이 더 나은 대안임
  - grep을 호출하는 대신 libpcre 같은 것을 사용하는 것이 더 효율적일 수 있음
  - git, hg, rg, ag 등 비-POSIX 유틸리티에서는 긴 옵션을 사용하는 것이 합리적임

* 문자열 보간과 명령 실행을 혼합하지 말아야 함
  - 특히 명령이 셸을 통해 처리될 때 주의해야 함
  - 어떤 언어든지 리스트 기반 또는 배열 기반 실행 API를 사용하여 인수를 execv(2), execvp(2) 등으로 직접 전달해야 함

* 긴 옵션을 사용해야 한다는 것에 동의하지만, 이식성을 고려해야 함
  - 모든 BSD 배포판이 GNU 스타일의 긴 옵션을 지원하지 않음
  - 이식성을 원한다면 짧은 옵션을 사용해야 함

* 모든 옵션 뒤, 동적 인수 앞에 “--”를 사용하는 것을 잊지 말아야 함

* 명령을 호출하기 전에 명령의 길이가 ARG_MAX보다 긴지 확인해야 함
  - 예를 들어, 다음과 같은 명령이 있을 때:
    - `grep --ignore-case --files-with-matches -- "hello" *.c`
  - 이렇게 호출해야 함:
    - `CMD="grep --ignore-case --files-with-matches -- \"hello\" *.c"`
    - `ARG_MAX=$(getconf ARG_MAX)`
    - `CMD_LEN=${#CMD}`
    - `if (( CMD_LEN > ARG_MAX )); then`
    - `echo "Error: Command length ($CMD_LEN) exceeds ARG_MAX ($ARG_MAX)." >&2`
    - `exit 1`
    - `fi`
    - `eval "$CMD"` # 경고, 파일 이름을 평가함

* 이 방법에 동의함. 또 다른 이점은 옵션이 무엇을 하는지 man 페이지에서 grep하기가 더 쉬워짐

* 스크립트를 다른 POSIX 시스템에 이식 가능하게 만들고 싶다면 짧은 옵션을 사용해야 할 수도 있음
  - 긴 옵션은 표준화되지 않았음
  - 스스로 트레이드오프를 결정해야 함

* 옵션을 별도의 줄에 두어 추적하고 git blame하기 쉽게 해야 함

* 스크립트를 작성할 때의 기본 규칙 중 하나임. 긴 옵션이 가능하다면 사용해야 함
  - 그렇게 하는 것이 너무 합리적임

* 긴 형식 옵션은 독자에게 훨씬 더 설명적임
  - 오타가 덜 발생함
