Я пытаюсь запустить командный файл из своего приложения, поэтому мне нужно использовать «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
Возможный дубликат [Как запустить терминал команду в стремительном сценарий? (например, xcodebuild)] (http://stackoverflow.com/questions/26971240/how-do-i-run-an-terminal-command-in-a-swift-script-eg-xcodebuild) –
Я добавил комментарий выше , – Peter71
NSTask не оставлен, он просто переименован в Process in Swift 3. Вероятно, вы не правильно его называете. ''/usr/local/bin/ExifTool "' должен быть пуском запуска, а '[" -ext "," .CR2 "]' массивом аргументов. –