2016-09-15 4 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 не оставлен, он просто переименован в Process in Swift 3. Вероятно, вы не правильно его называете. ''/usr/local/bin/ExifTool "' должен быть пуском запуска, а '[" -ext "," .CR2 "]' массивом аргументов. –

ответ

0

я использую быстр называть Objective-C menthod (хотя и не лучший способ)

  1. определяют Objective-C Util menthod

    #import "SystemTaskHelper.h" 
    @implementation SystemTaskHelper 
    +(void)performSystemTask:(NSString *)task 
    { 
        system([task UTF8String]); 
    } 
    @end 
    
  2. импорта Objective-C util.h в Bridging-header.h, и в быстром использовании SystemTaskHelper.performSystemTask("ls -param >file.txt")

+0

Вы больше не можете использовать систему на iOS –

+0

Это Mac OS – jeffreysuej

Смежные вопросы