【问题标题】:Why is the defaults command just returning the syntax?为什么默认命令只返回语法?
【发布时间】:2020-04-16 08:53:20
【问题描述】:

我正在尝试从我在 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. 我正在运行 Mac 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,而不是运行完整的命令,因为如果你在终端中这样做,你会得到相同的结果。为什么要这样做;有谁知道如何解决它?

【问题讨论】:

  • 很确定每个“单词”都应该是一个单独的参数。这不是一个大论点。

标签: swift xcode terminal macos-catalina


【解决方案1】:

如果您尝试调用多个命令,那么您希望调用 shell,而不是直接调用 defaults 命令。

还有:

  • 将每个参数分离到数组中的一个单独的单词中。
  • 我可能会使用&amp;&amp; 来调用多个命令。

类似:

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

【讨论】:

  • 感谢您的回复。我在上面尝试了您的代码,但收到以下错误/usr/bin/defaults: /usr/bin/defaults: cannot execute binary file
【解决方案2】:

感谢大家的帮助。我通过将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()

【讨论】:

  • 我希望您不打算在应用商店发布您的应用...
猜你喜欢
  • 2021-04-27
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多