Rust 명령줄의 인수 받기

2023. 6. 18. 23:40Language/Rust

개요

Rust는 Command Line에 즉 CLI 도구에 많이 사용 됩니다.

그래서 오늘은 Command Line에서 인수를 받는 방법에 대해 알아보도록 하겠습니다.

표준 라이브러리 인수 다루기

Rust의 표준 라이브러리인 std::env::args()를 통해 Rust 프로그램의 인수를 가져 올 수 있습니다.

fn main() {
    let args = std::env::args();

    for (i, s) in args.enumerate(){
        println!("{}", s);
    }
}
$ cargo run 10 20 30 a b c 1.1 1.2
10
20
30
a
b
c
1.1
1.2

인수의 경우는 전부 string으로 받게 됩니다.

Clap 크래이트 사용하기

CLI를 사용하기 위해서는 표준 라이브러리 만으로 인수를 다루기에는 어려울 수 있습니다.

예를 들어 $ ls -al, $ls -a -l 이런 식으로 복잡한 인수들도 있기 때문입니다.

이럴때 도와주는 서드 파티 라이브러리가 Clap입니다.

$ cargo add clap --features derive

패키지를 추가해 줍니다. 그리고 main.rs를 작성합니다.

use clap::Parser;

/// Simple program to greet a person
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
    /// Name of the person to greet
    #[arg(short, long)]
    name: String,

    /// Number of times to greet
    #[arg(short, long, default_value_t = 1)]
    count: u8,
}

fn main() {
    let args = Args::parse();

    for _ in 0..args.count {
        println!("Hello {}!", args.name)
    }
}

#[command(author, version, about, long_about = None)]의 의미는 아래와 같습니다.

  • author: 이 프로그램에서 작성한 작성자에 대한 정보를 포함합니다.
  • version: 이 프로그램의 버전 번호를 나타냅니다.
  • about: 이 프로그램이 무엇에 대해 작동하는지에 대한 간단한 설명을 제공합니다.
  • long_about: 이 프로그램에 대한 상세한 설명을 포함하는 파일의 경로를 나타냅니다. None으로 설정하면 무시됩니다.

#[arg(short, long)]의 의미는 name 옵션을 사용 할 때 짧은 옵션(-n) 긴 옵션 (--name) 둘다 사용 한다는 뜻입니다.

그리고 default_value_t = 1의 의미는 옵션이 없으면 기본 값이 1이라는 뜻입니다.

실행해보기

위에서 만든 프로그램을 실행 해보도록 하겠습니다. 명령 인자를 받기 위해서는 먼저 릴리즈를 해야합니다.

$ cargo build -r

target 폴더에 exe 파일이 생긴 것을 확인 할 수 있습니다.

 

> .\target\release\command-line.exe -h
Simple program to greet a person

Usage: command-line.exe [OPTIONS] --name <NAME>

Options:
  -n, --name <NAME>    Name of the person to greet
  -c, --count <COUNT>  Number of times to greet [default: 1]
  -h, --help           Print help
  -V, --version        Print version

 

실행 시켜서 -h 옵션으로 -help를 하면 위에서 정의 한 옵션들이 나오게 됩니다.

 

> .\target\release\command-line.exe -n bak -c 5
Hello bak!
Hello bak!
Hello bak!
Hello bak!
Hello bak!

 

'Language > Rust' 카테고리의 다른 글

cargo diesel_cli 설치 에러  (0) 2023.06.22
환경변수 파일 읽기  (0) 2023.06.21
Rust의 HashMap 소개  (1) 2023.06.15
Rust Shuffle  (0) 2023.06.11
Rust fmt 모듈  (0) 2023.06.07