#swift #macos #terminal #command
Вопрос:
Здравствуйте, я хочу открыть новое приложение с аргументами, используя команду терминала с помощью swift-кода моего приложения macOS
У меня есть команда терминала open -n /Applications/test.app -- args arg1
, которая отлично работает, когда я запускаю ее в терминале
но когда я пытаюсь запустить его с помощью swift — кода
static func shellCommand () {
let task = Process()
task.launchPath = "/bin/zsh"
let args:[String] = ["-c","open -n /Applications/test.app","--args aaaa"]
task.arguments = args
let pipe = Pipe()
let errorPipe = Pipe()
task.standardOutput = pipe
task.standardError = errorPipe
task.launch()
task.waitUntilExit()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = String(data: data, encoding: String.Encoding.utf8)!
let errorData = errorPipe.fileHandleForReading.readDataToEndOfFile()
let error = String(decoding: errorData, as: UTF8.self)
print("out put from shell command (output) error (error)")
}
Это не работает, я тоже пытался
let args:[String] = ["-c","open -n /Applications/test.app --args arg1"]
Спасибо вам за любую подсказку или помощь
Комментарии:
1. Зачем вы помечаете thsi bash , если затем используете zsh для запуска приложения? Кроме того, open -это внешняя команда на Mac (исполняемый файл), и я не понимаю, почему вы вообще хотите использовать оболочку для ее выполнения.
2. Привет @user1934428 извините за тег, но я думаю, что для этой конкретной команды результат будет таким же, когда я использую bash или zsh
open -n /Applications/test.app -- args arg1
. Мне нужно открыть то же приложение с новыми аргументами3. Почему вы используете оболочку? Вы не делаете ничего необычного, для чего понадобилась бы оболочка?
4. Я никогда не использовал Swift, но я бы сделал это вот так. В вашем случае программа для запуска открыта , и вам нужно передать аргументы в виде массива из 4 элементов.
Ответ №1:
Я почти уверен, что вместо этого
let args:[String] = ["-c","open -n /Applications/test.app","--args aaaa"]
это должно быть так
let args:[String] = ["-c","open","-n","/Applications/test.app","--args","aaaa"]
Кроме того, вам действительно не нужно проходить через z shell. Вы могли бы просто позвонить open
напрямую.
task.launchPath = "/usr/bin/open"
let args:[String] = ["-n","/Applications/test.app","--args","aaaa"]