2014-10-16 4 views
3

신속한 시스템 명령에 대한 설명이 있습니까? 예를 들어,이 코드는xcode 6 swift system() 명령

let x = system("ls -l `which which`") 
    println(x) 

는 -rwxr-XR-X 1 개 루트 휠을 14496 8월 30일 내가 싶습니다

0

4시 29분는/usr/빈/생산 리턴 코드

답변

7

system()은 Swift 명령이 아니라 BSD 라이브러리 기능입니다. 당신은 터미널 창에서 "man system"와 문서 를 얻을 :

시스템() 함수의 손에 인수 명령 명령 인터프리터 쉬에 (1). 호출 프로세스 은 쉘이 명령 실행을 끝내고 SIGINT 및 SIGQUIT를 무시하고 SIGCHLD를 블로킹하기를 기다립니다.

"ls"명령의 출력은 표준 출력에만 쓰여지고 스위프트 변수에는 기록되지 않습니다.

더 많은 제어가 필요한 경우 Foundation 프레임 워크에서 NSTask을 사용해야합니다. 여기 간단한 예입니다 :

let task = NSTask() 
task.launchPath = "/bin/sh" 
task.arguments = ["-c", "ls -l `which which`"] 

let pipe = NSPipe() 
task.standardOutput = pipe 
task.launch() 

let data = pipe.fileHandleForReading.readDataToEndOfFile() 
if let output = NSString(data: data, encoding: NSUTF8StringEncoding) { 
    println(output) 
} 

task.waitUntilExit() 
let status = task.terminationStatus 
println(status) 

쉘을 통해 명령어를 실행 "/ 빈/쉬 -c 명령 ..."여기 필요하다 "다시 틱"인수의 때문이다. 시스템이 스위프트의 실행에 와서 어떻게 신속 명령이 아닌 경우

task.launchPath = "/bin/ls" 
task.arguments = ["-l", "/tmp"] 
+0

: 일반적으로, 직접 예를 들어 을 명령을 호출하는 것이 좋습니다? 이것은 변덕스러운 발언이 아니며 스위프트의 의미에 관한 질문입니다. 여러분이 코르크 작품에 대해 제시 한 코드는 이전에 시도 했었습니다. 왜 그냥 system()을 사용할 수 없으며 사용해서는 안되는 지 궁금합니다. 내 "코드에서 메모하면 변수 x는 ls와 $ 모두의 출력을 할당받습니다. –

+0

@LannyRosicky : 모든 (잘, 대부분의) 라이브러리 함수는 Foundation에 의해 포함 된 Darwin 모듈의 일부로 Swift에서 사용할 수 있습니다 –

+0

BTW, 예제 코드는 "조건부 바인딩에서 바운딩 된 값을 옵션 타입으로 보냅니다." –

관련 문제