Swift로 셸 커맨드 실행시키기
2021년 5월 13일 수정
≡ 목차 (Table of Contents)
이 글은 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
을 액세스하는 메서드도 제공되니 필요하다면 매뉴얼을 읽어보자.