2011-12-19 1 views
5

명령 줄에서 명령을 실행하고 출력을 표시하는 작은 MacRuby 상태 표시 줄 응용 프로그램을 작성하려고합니다. 나는 이것을 어떻게하는지 모른다. Mac 응용 프로그램에서 어떻게 할 수 있습니까?Mac/MacRuby 응용 프로그램에서 쉘 명령을 실행하는 방법은 무엇입니까?

업데이트 : 기타해야 할 일은 관리자 암호를 요청하는 것입니다. 때로는 명령 줄에서이 스크립트를 실행하면 암호를 묻습니다. 사용자에게 암호를 묻는 방법 (또는 직접 입력 할 수 있도록 셸을 포함시키는 방법)을 모르겠습니다. 당신의 명령을 실행하기 위해 관리자 권한을 필요로하는 경우

output = `cd ~ && ls` 
puts output # or assign to a label, textbox etc. 

, 모든에서 명령을 실행되지 않고 응답을 반환하지 않습니다

+0

스크립트가 정확히 무엇을합니까? – SeanNieuwoudt

+0

결국 [vagrant] (http://vagrantup.com)의 GUI 래퍼가 될 것입니다. 그래서 나는'썩은 냄새를 풍기고 '출력을 볼 필요가있다. – Andrew

답변

6

코코아 및 MacRuby를 사용하면 NSTask를 사용하십시오.

framework 'Cocoa' 

task = NSTask.alloc.init 
task.setLaunchPath("/bin/ls") 

arguments = NSArray.arrayWithObjects("-l", "-a", nil) 
task.setArguments(arguments) 

pipe = NSPipe.pipe 
task.setStandardOutput(pipe) 

file = pipe.fileHandleForReading 

task.launch 

data = file.readDataToEndOfFile 

string = NSString.alloc.initWithData(data, encoding: NSUTF8StringEncoding) 
puts "Command returned: " 
puts string 

불행하게도, 관리자 권한을 포함하여, 특히 MacRuby를 사용하여, 사소한 일이 아니다 : 및 인쇄 출력 -la LS를 실행 예. SecurityFoundation 프레임 워크와이 link을 살펴보십시오. 기본적으로, 당신은 도구의 경로가, 인수를 플래그를 실행하도록 구성된 AuthorizationRef와

AuthorizationExecuteWithPrivileges(...) 

를 호출해야합니다. 유용한 예가 here (ObjC에서)이 작동 방식을 보여줍니다.

+0

답변이 업데이트되었습니다. – jtomschroeder

+0

감사! 그게 도움이! 내가 말할 수있는대로, 이것은 끝날 때까지 막을 것이다. 비동기 적으로 명령을 실행하고 각 행이 출력 될 때 UI를 업데이트하는 방법이 있습니까? – Andrew

+0

비동기 적으로 업데이트하려면 _readInBackgroundAndNotify_를 사용하거나 다른 스레드에서 StandardOutput을 모니터하십시오. – jtomschroeder

1

당신은 단순히 역 따옴표를 사용할 수 있습니다.

+0

작동하는 것처럼 보이지만 사용자에게 암호를 묻는 해결책을 제시해야합니다. 명령 줄에서 스크립트를 실행할 때 관리자 권한이 필요한 작업을 시도하므로 암호를 입력하라는 메시지가 표시됩니다. – Andrew

+0

macruby_main() 바로 전에 objective-c main() 메서드 내에서 보호 된 시스템 파일을 읽으려고 시도하는 방법에 대해 설명합니다. 그게 허가를 강요 할거야. – SeanNieuwoudt