Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 为什么defaults命令只是返回语法?_Swift_Xcode_Terminal_Macos Catalina - Fatal编程技术网

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

Swift 为什么defaults命令只是返回语法?,swift,xcode,terminal,macos-catalina,Swift,Xcode,Terminal,Macos Catalina,我正在尝试从我在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函数中

我正在尝试从我在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(“helloworld”)
脚本替换上面的代码时,这个按钮实际上调用了这个函数,它工作得很好。但是,当我在操作中使用上述代码并单击它时。答案是

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”[-currentHost |-host]后跟以下选项之一:
读取显示所有默认值
读取显示给定域的默认值
读取显示给定域、键的默认值
read type显示给定域的类型,key
写入域(覆盖现有域)
为域写入密钥
重命名将旧的_键重命名为新的_键
删除删除域
删除域中的密钥
导入将plist写入到域的路径
导入-将plist从stdin写入域
导出将域另存为路径的二进制plist
导出-将域作为xml plist写入标准输出
域列出所有域
查找列出包含word的所有条目
帮助打印此帮助
is(|-app |-globalDomain)
或指向省略“.plist”扩展名的文件的路径
是以下各项之一:
-串
-资料
-内部[eger]
-浮动
-bool[ean](真|假|是|否)
-日期
-数组。。。
-数组添加。。。
-口述。。。
-dict添加。。。
如果我运行上述脚本
默认值,请删除com.apple.dock;在终端中手动关闭所有停靠
,它工作正常并重置所有停靠设置

其他信息

  • 该应用程序是一个代理,因为我将其设置为一个状态/菜单栏 应用
  • 我正在运行MacOS10.15.4Catalina
  • 我也试过了 运行
    defaults写入com.apple.dock持久应用程序-数组添加
    “{”瓷砖类型“=”间隔瓷砖“}”;killall Dock
    再次在 终端,但不是从应用程序运行时
  • 我还尝试将这些命令放入Xcode项目内的文件中,例如
    spacer.command
    ,然后将
    let arguments=[“defaults delete com.apple.dock;killall dock”]
    行更改为
    let arguments=[“spacer.command”]
    。然而,它产生了同样的结果

  • 我的问题是,swift代码似乎只运行第一个单词
    defaults
    ,而不是运行full命令,因为如果在终端中这样做,则会得到相同的结果。它为什么要这样做;有人知道如何修复它吗?

    如果您试图调用多个命令,那么您需要调用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()
    

    或者调用每个命令(
    默认值
    killall
    )。

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

    很确定每个“词”都应该是一个独立的论点。这不是什么大争论,谢谢你的回答。我尝试了上面的代码,但出现以下错误
    /usr/bin/defaults:/usr/bin/defaults:无法执行二进制文件
    @myname您可能必须将
    “sh”
    作为第一个参数传递。。。否则可能会使用
    -c
    -e
    或类似的方法。我希望您不打算在应用商店中发布您的应用。。。