【发布时间】:2017-01-23 11:26:03
【问题描述】:
我尝试从我的应用程序启动命令文件,因此我需要使用“posix_spawn”。但是使用它需要奇怪地使用指针。我没有找到任何 Swift (3.0) 的示例,只有我无法翻译的 C++ 或 Objective C。
我只需要类似的东西(在旧系统调用中):
let err = system("ls -param >file.txt")
有什么想法吗?
编辑: 链接的解决方案不匹配。 首先它不使用编译器提到的 posix_spawn 函数。它使用了 NSTask,这似乎也被放弃了。但我尝试了这个例子,结果是:
func shell(launchPath: String, arguments: [String]) -> String
{
let task = Process()
task.launchPath = launchPath
task.arguments = arguments
let pipe = Pipe()
task.standardOutput = pipe
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output: String = NSString(data: data, encoding: String.Encoding.utf8.rawValue)! as String
return output
}
这里进行了 XCode 8 所需的所有更改。但是调用时,它永远不会从“.launch()”返回。
在输出调试窗口的某处我发现了这一行:
2016-09-15 15:06:36.793 DSRenamer[96562:2569582] launch path not accessible
同样的命令在终端窗口中运行良好:
/usr/local/bin/ExifTool -ext .CR2
【问题讨论】:
-
我在上面添加了评论。
-
NSTask 并没有被放弃,它只是在 Swift 3 中被重命名为 Process 。你可能没有正确调用它。
"/usr/local/bin/ExifTool"应该是启动路径,["-ext", ".CR2"]应该是参数数组。 -
task.waitUntilExit()将阻塞直到Process任务完成。可以使用if task.terminationStatus == 0 { print("Task succeeded.") }检查结果状态