Как открыть новое приложение с аргументами из приложения swift с помощью команды терминала

#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"]