Swift로 셸 커맨드 실행시키기

2021년 5월 13일 수정

이 글은 Swift를 사용해 커맨드를 실행시키고 결과를 얻는 몇 가지 방법을 정리한다. 커맨드이기 때문에 을 통해서 명령이 실행되어야 한다는 전제가 고려된 내용이다.

Process를 이용한 방법 1

Process.run() 메서드를 활용한 방법이다.

try! Process.run(URL(fileURLWithPath: "/bin/sh"),
                 arguments: ["-c", command]) {
    (task) in
    guard task.terminationStatus == 0 else {
        // Failed
        return
    }

    if let results = task.standardOutput as? String {
        ...
    }
}

응답 코드도 알 수 있고 stdout 으로 전달되는 내용을 그대로 읽을 수도 있다. 비동기로 동작하기 때문에 딱히 다른 신경을 쓸 필요는 없다.

굳이 언급하자면 유틸리티의 실행 결과는 0이 성공을 의미한다.

Process를 이용한 방법 2

그냥 실행시키고 결과를 딱히 처리할 필요가 없다면 아래와 같은 식도 가능하다.

DispatchQueue.global().async {
    let task = Process()
    task.launchPath = "/bin/sh"
    task.arguments = ["-c", command]
    task.launch()
    task.waitUntilExit()
}

응답이 비동기로 동작하지 않기 때문에 GCD를 이용해 비동기로 실행하는 예제다. UI가 얼어도 딱히 상관없다면 DispatchQueue.global().async 부분은 생략해도 된다.

물론 Process에는 stdin 이나 stdout 을 액세스하는 메서드도 제공되니 필요하다면 매뉴얼을 읽어보자.