Why my arguments are being blocked when running a shell command?

匆匆过客 提交于 2020-06-17 23:03:10

问题


I am looking to run a command on command line from my SWIFT app in MAC.

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

when I print the resString on console, I. get the following

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

which executes normally when I copy paste in the command line. but on the other side, the app is opened but arguments are being ignored.

I also tried this https://stackoverflow.com/a/53725745/12197482 still didn't work, the app is launched but the arguments don't get through

EDIT: Here's the funniest thing that's really frustrating, I created a small script that have a command, which contains

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

I ran it from terminal again, args are passed correctly with no issues. I tried to run at from my app and the same issue happened again, app run play BUT NO ARGS are being passed which is I find really weird.


回答1:


Try using /bin/sh as executableURL instead:

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

That should do it.

You might also want to try using task.run() instead, and waiting for completion:

try task.run()
task.waitUntilExit()

I wrote System to make this much easier. Feel free to use it or copy/paste the code: https://github.com/eneko/System/blob/master/Sources/System/System.swift#L107

Updated with additional info

Since you are trying to open a macOS app, there is no need to use sh or bash, you can invoke open directly.

To test this, I've written a sample macOS app in Xcode that all it does is display arguments on screen. Then, I proceeded to launch the app from a macOS Playground, as seen in the screenshot:

Here is the code to launch the app with arguments:

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 is used to launch an instance of the app, even if the app is already running. Might not be needed in your case.

Hope this helps!



来源:https://stackoverflow.com/questions/62203978/why-my-arguments-are-being-blocked-when-running-a-shell-command

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!