2016-09-15 66 views
2

我尝试从我的应用程序启动一个命令文件,所以我需要使用“posix_spawn”。但是这需要奇怪地使用指针。我没有找到任何Swift(3.0)的例子,只有C++或Objective C,我无法翻译。使用posix_spawn?

我只需要类似的东西(在旧系统调用):

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 
+1

可能的[复制如何运行一个脚本迅速的终端命令? (例如xcodebuild)](http://stackoverflow.com/questions/26971240/how-do-i-run-an-terminal-command-in-a-swift-script-eg-xcodebuild) –

+0

我上面添加了一条评论。 – Peter71

+1

NSTask没有被放弃,它只是被重命名为Swift 3中的Process。您可能没有正确调用它。 ''/ usr/local/bin/ExifTool“应该是启动路径,''”-ext“,”.CR2“]'参数数组。 –

回答

0

我用迅速来调用的Objective-C menthod(虽然不是最好的方式)

  1. 定义了一个objective-c实用程序

    #import "SystemTaskHelper.h" 
    @implementation SystemTaskHelper 
    +(void)performSystemTask:(NSString *)task 
    { 
        system([task UTF8String]); 
    } 
    @end 
    
  2. 进口的Objective-C util.h到转职Header.h,并迅速用 SystemTaskHelper.performSystemTask("ls -param >file.txt")

+0

你不能在iOS上使用系统 –

+0

这是Mac OS – jeffreysuej