为什么运行 shell 命令时我的参数被阻止?

2023-12-30

我希望从 MAC 中的 SWIFT 应用程序在命令行上运行命令。

var resString = "open \(app.getLocation()) --args 25 40"
let task = Process()
task.launchPath = "/bin/bash"
task.arguments = ["-c", resString]
task.launch()
print (resString)

当我在控制台上打印 resString 时,我得到以下内容

open [path to app on my local drive] --args 25 40

当我在命令行中复制粘贴时,它可以正常执行。但在另一边,应用程序已打开,但参数被忽略。

我也尝试过这个https://stackoverflow.com/a/53725745/12197482 https://stackoverflow.com/a/53725745/12197482仍然不起作用,应用程序已启动,但参数未通过

编辑:这是最有趣的事情,真的令人沮丧,我创建了一个带有命令的小脚本,其中包含

#! /bin/bash
open ./SimulatorDebug.app --args arg1 arg2

我再次从终端运行它,参数正确传递,没有任何问题。我尝试从我的应用程序运行,但同样的问题再次发生,应用程序运行播放但没有传递任何 ARGS,这我觉得很奇怪。


尝试使用/bin/sh as executableURL反而:

task.executableURL = URL(fileURLWithPath: "/bin/sh")

应该可以做到这一点。

您可能还想尝试使用task.run()相反,并等待完成:

try task.run()
task.waitUntilExit()

我编写了 System 来使这变得更容易。请随意使用它或复制/粘贴代码:https://github.com/eneko/System/blob/master/Sources/System/System.swift#L107 https://github.com/eneko/System/blob/master/Sources/System/System.swift#L107

更新了附加信息

由于您正在尝试打开 macOS 应用程序,因此无需使用sh or bash,你可以调用open直接地。

为了测试这一点,我在 Xcode 中编写了一个示例 macOS 应用程序,它所做的只是在屏幕上显示参数。然后,我继续从 macOS Playground 启动该应用程序,如屏幕截图所示:

以下是使用参数启动应用程序的代码:

let process = Process()
process.executableURL = URL(fileURLWithPath: "/usr/bin/open")
process.arguments = [
    "/Applications/ArgumentTest/ArgumentTest.app",
    "-n",
    "--args",
    "Open",
    "From",
    "Playground"
]

try process.run()

-n用于启动应用程序的实例,即使应用程序已经在运行。您的情况可能不需要。

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么运行 shell 命令时我的参数被阻止? 的相关文章

随机推荐