我想写一个小的MacRuby状态栏应用程序,从命令行运行一个命令并显示输出。我不知道该怎么做。我怎样才能从我的Mac应用程序做到这一点?如何从Mac/MacRuby应用程序运行shell命令?
更新:可能需要做的另一件事是请求管理员密码。有时当我从命令行运行这个脚本时,它会询问我的密码。我不知道如何提示用户输入密码(或者嵌入shell以便直接输入密码)。
我想写一个小的MacRuby状态栏应用程序,从命令行运行一个命令并显示输出。我不知道该怎么做。我怎样才能从我的Mac应用程序做到这一点?如何从Mac/MacRuby应用程序运行shell命令?
更新:可能需要做的另一件事是请求管理员密码。有时当我从命令行运行这个脚本时,它会询问我的密码。我不知道如何提示用户输入密码(或者嵌入shell以便直接输入密码)。
使用Cocoa和MacRuby,利用NSTask。例如执行LS -la并打印输出:
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。看看SecurityFoundation框架,并且这个link。实质上,您需要致电
AuthorizationExecuteWithPrivileges(...)
带有配置的AuthorizationRef,要执行的工具路径,标志,参数。有一个有用的示例here(在ObjC中)显示了这是如何工作的。
已更新的答案。 – jtomschroeder 2012-02-16 15:38:56
谢谢!这有帮助!从我所知道的情况来看,这会阻塞,直到完成。有没有办法异步运行命令并更新用户界面作为每一行输出? – Andrew 2012-02-16 16:39:04
要异步更新,可以使用_readInBackgroundAndNotify_或在另一个线程中监视StandardOutput。 – jtomschroeder 2012-02-16 18:02:17
你可以简单地使用反引号:
output = `cd ~ && ls`
puts output # or assign to a label, textbox etc.
如果你的命令需要管理员权限才能运行,它不会在所有运行该命令,不会返回响应。
看起来它可能会工作,但我需要想出一个解决方案,允许我提示用户输入密码。当我从命令行运行时,有时在脚本的中途运行,它会尝试执行一些需要管理员权限的操作,因此它会提示用户输入密码。 – Andrew 2011-12-19 19:38:54
如何尝试在macruby_main()之前读取objective-c main()方法中的受保护系统文件。这将强制授权。 – SeanNieuwoudt 2011-12-19 20:36:34
你的脚本到底做了什么? – SeanNieuwoudt 2011-12-19 19:27:30
最终,它将成为[vagrant](http://vagrantup.com)的GUI包装。所以我需要运行'vagrant up'并查看输出。 – Andrew 2011-12-19 19:33:53