Почему команда по умолчанию просто возвращает синтаксис? - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь запустить команду терминала из приложения, над которым я работаю в Xcode 11.4.

let path = "/usr/bin/defaults"
let arguments = ["defaults delete com.apple.dock; killall Dock"]

let task = Process.launchedProcess(launchPath: path, arguments: arguments)
task.waitUntilExit()

Этот код находится внутри функции @IBAction, которая подключена к кнопке. У меня есть тестирование, что кнопка действительно вызывает это, так как я заменил приведенный выше код простым print("Hello world") скриптом, и он отлично работал. Однако, когда у меня есть вышеуказанный код в действии и нажмите его. Ответ:

Command line interface to a user's defaults.
Syntax:

'defaults' [-currentHost | -host <hostname>] followed by one of the following:

  read                                 shows all defaults
  read <domain>                        shows defaults for given domain
  read <domain> <key>                  shows defaults for given domain, key

  read-type <domain> <key>             shows the type for the given domain, key

  write <domain> <domain_rep>          writes domain (overwrites existing)
  write <domain> <key> <value>         writes key for domain

  rename <domain> <old_key> <new_key>  renames old_key to new_key

  delete <domain>                      deletes domain
  delete <domain> <key>                deletes key in domain

  import <domain> <path to plist>      writes the plist at path to domain
  import <domain> -                    writes a plist from stdin to domain
  export <domain> <path to plist>      saves domain as a binary plist to path
  export <domain> -                    writes domain as an xml plist to stdout
  domains                              lists all domains
  find <word>                          lists all entries containing word
  help                                 print this help

<domain> is ( <domain_name> | -app <application_name> | -globalDomain )
         or a path to a file omitting the '.plist' extension

<value> is one of:
  <value_rep>
  -string <string_value>
  -data <hex_digits>
  -int[eger] <integer_value>
  -float  <floating-point_value>
  -bool[ean] (true | false | yes | no)
  -date <date_rep>
  -array <value1> <value2> ...
  -array-add <value1> <value2> ...
  -dict <key1> <value1> <key2> <value2> ...
  -dict-add <key1> <value1> ...

Если я запускаю вышеописанный скрипт defaults delete com.apple.dock; killall Dock вручную в терминале, он работает нормально и сбрасывает все настройки доков.

Другая информация

  1. Приложение является агентом, так как я делаю его как приложение в виде строки состояния / строки меню
  2. Я работаю в Ma c OS 10.15.4 Catalina
  3. Я также попытался запустить defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="spacer-tile";}'; killall Dock, который снова работал в терминале, но не при запуске из приложения.
  4. Я также попытался поместить эти команды в файл внутри проекта XCode, например spacer.command, и затем изменить let arguments = ["defaults delete com.apple.dock; killall Dock"] строка до let arguments = ["spacer.command"]. Однако он выдает тот же результат.

Моя проблема в том, что вместо выполнения полной команды код swift просто запускает первое слово defaults, потому что если вы сделаете это в терминале, вы получите тот же результат. Зачем это делать? а кто-нибудь знает как это исправить?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Спасибо всем за помощь. Я решил это, поместив команду оболочки в файл в каталоге проекта, а затем вызвав этот код для его запуска ...

let compiler = "/bin/sh"
let filePath = Bundle.main.url(forResource: "scriptName", withExtension: "sh")
let file = filePath!.path
let arguments = [file]
let task = Process.launchedProcess(launchPath: compiler, arguments: arguments)

task.waitUntilExit()
0 голосов
/ 16 апреля 2020

Если вы пытаетесь вызвать несколько команд, вы хотите вызвать оболочку, а не команду defaults напрямую.

Также:

  • Разделите каждый аргумент на отдельное слово в массиве.
  • Я бы, вероятно, использовал && для вызова нескольких команд.

Что-то вроде:

let path = "/bin/sh"
let arguments = ["/usr/bin/defaults", "delete", "com.apple.dock", "&&", "killall", "Dock"]

let task = Process.launchedProcess(launchPath: path, arguments: arguments)
task.waitUntilExit()

Альтернативно вызовите каждую команду (defaults и killall) отдельно.

...