为什么 defaults 命令只返回语法?

Why is the defaults command just returning the syntax?

我正在尝试 运行 来自我在 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. 该应用程序是一个代理,因为我将其作为 status/menu 栏 申请
  2. 我是 运行ning Mac OS 10.15.4 Catalina
  3. 我也试过了 运行ning 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 因为如果你这样做终端你得到相同的结果。为什么要这样做;有人知道如何解决吗?

如果您尝试调用多个命令,那么您希望直接调用 shell,而不是 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()

或者分别调用每个命令(defaultskillall)。

感谢大家的帮助。我通过将 shell 命令放入项目目录中的文件然后将此代码调用到 运行 来解决它...

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()