프로그래밍/Linux

POSIX 표준에 따라 CLI 애플리케이션 만들기

Lou Park 2023. 6. 11. 15:46

POSIX (Portable Operating System Interface)
UNIX OS의 공통 API를 정리하여 이식성이 높은 유닉스 응용 프로그램을 개발하기 위한 목적으로 IEEE가 책정한 애플리케이션 인터페이스 규격.

 

CLI 애플리케이션은 Flag, Option, Argument, Subcommand로 이루어져 있다.

 

처음 써보는 CLI 앱이어도 --help를 쳐서 나오는 설명을 읽고 당황하지 않고 쓸 수 있다. 프로그램마다 기상천외한 사용법이 있는게 아니라 어떠한 규칙이 있어보이는데, 그것이 바로 POSIX 표준 덕분이다. POSIX 표준은 Command line 옵션을 지정하고 구문분석하는데 사용되는 일련의 규칙을 제공하여 다양한 CLI 툴을 이해하고 사용하기 쉽게 만들 수 있도록 한다.

 

# CLI 애플리케이션의 명령줄 인수는 어떻게 구조화 되어있을까?

CLI 애플리케이션의 구성요소를 쪼개서 살펴보자.

 

Flag/Option

POSIX 표준에 따라, Flag/Option은 -뒤에 한 글자를 붙인 형태로 정의할 수 있다. 그리고 여러 옵션을 하나의 인자로 합칠수도 있다.

-a
-b
-ab

--뒤에 단어가 붙는 형태로 조금더 서술적이고 읽기 쉽게 쓸 수도있다. Long Option이라고 부르는 형태다.

--option
--flag

말하다보니 플래그? 옵션? 비슷해보인다. 정말로 비슷하게 쓸 수도있는데 일반적으로는 입력받는 값이 있냐 없냐정도로 구분할 수 있다.

Flag는 프로그램의 전반적인 동작을 제어하거나 설정을 켜고 끄는데 사용되며, 주로 단순한 토글 옵션을 나타낸다.

--force (강제 실행)
-h (도움말 출력)
-q (조용한 모드로 실행)

Option은 추가적인 값이 필요한 설정, 또는 사용자가 입력한 값을 전달 할 때 사용된다.

LongOption일떄는 =를, Short Option일때는 공백을 두고 값을 전달 해준다.

--input=<filename> (입력 파일 지정)
-p <port> (특정 포트로 연결)

 

Positional Arguments

Positional Arguments는 특정한 위치에 반드시 있어야하는 Argument다. 프리픽스 따위가 없고, CLI 애플리케이션이 작동하기 위해 반드시 필요한 Argument들이 들어가게 된다.

 

파일을 카피하기 위한 cp에서 srcdst중 하나가 빠지기라도 한다면 오류를 뱉어낼 것이다.

cp [src] [dst]

 

Sub-Commands

git을 예로들면 commit, push, pull등 다양한 Sub-Command들이 존재한다. Sub-Commands는 관련된 기능을 그룹화하고 사용자가 다양한 기능을 사용하기 쉽게 하기 위해 이용된다.

 

# 설정 파일(Configuration)은 어디에 저장할까?

대부분의 OS에는 설정파일과 유저 데이터를 저장하기 위한 표준 위치가 있다.

UNIX 계열 시스템 (Linux, macOS)에서는~/.config/<program> 안에 저장한다. Windows에서는 %USERPROFILE%\\AppData\\Roaming\\<program> 이 된다.

 

Rust의 dirs(dirs - crates.io: Rust Package Registry) crate는 이를 OS별로 쉽게 접근할 수 있도록 해준다.

dirs::home_dir();
// Lin: Some(/home/alice)
// Win: Some(C:\\Users\\Alice)
// Mac: Some(/Users/Alice)
dirs::config_dir();
// Lin: Some(/home/alice/.config)
// Win: Some(C:\\Users\\Alice\\AppData\\Roaming)
// Mac: Some(/Users/Alice/Library/Application Support)