Macos 如何从Mac/MacRuby应用程序运行shell命令?

Macos 如何从Mac/MacRuby应用程序运行shell命令?,macos,shell,command-line,macruby,Macos,Shell,Command Line,Macruby,我试图编写一个小的MacRuby状态栏应用程序,从命令行运行命令并显示输出。我不知道怎么做。如何从Mac应用程序执行此操作 更新:它可能需要做的另一件事是询问管理员密码。有时,当我从命令行运行此脚本时,它会询问我的密码。我不知道如何提示用户输入密码(或嵌入shell以便他们可以直接键入密码)。您可以简单地使用backticks: output = `cd ~ && ls` puts output # or assign to a label, textbox etc. 如果您的

我试图编写一个小的MacRuby状态栏应用程序,从命令行运行命令并显示输出。我不知道怎么做。如何从Mac应用程序执行此操作


更新:它可能需要做的另一件事是询问管理员密码。有时,当我从命令行运行此脚本时,它会询问我的密码。我不知道如何提示用户输入密码(或嵌入shell以便他们可以直接键入密码)。

您可以简单地使用backticks:

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

如果您的命令需要管理员权限才能运行,它将根本不会运行该命令,也不会返回响应。

使用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框架,以及以下内容。基本上,你需要打电话

AuthorizationExecuteWithPrivileges(...)

使用配置的AuthorizationRef、要执行的工具路径、标志和参数。有一个有用的例子(在ObjC中)展示了它是如何工作的。

您的脚本到底做什么?最终,它将成为一个GUI包装器。因此,我需要运行
vagrant up
并查看输出。这看起来可能有效,但我需要想出一个解决方案,允许我提示用户输入密码。当我从命令行运行时,有时在脚本运行到一半时,它会尝试执行一些需要管理员权限的操作,因此会提示用户输入密码。在macruby_main()之前尝试读取objective-c main()方法中受保护的系统文件如何。这将强制授权。谢谢!那有帮助!据我所知,这将阻止直到完成。是否有一种方法可以异步运行命令并在每行输出时更新UI?要异步更新,可以使用readInBackgroundAndNotify,也可以在另一个线程中监视StandardOutput。