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

Viewed 627

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 Answers

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:

enter image description here

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!

Related