Doug Doug - 4 days ago 6
Swift Question

How do I replace the current Swift script process with a different one

When using Ruby, the following will terminate the current ruby script and replace the process with an instance of ssh:

exec "ssh host -p 1234 -v"


Is this possible to do in Swift?

Answer

execv and related functions from the BSD library can be called from Swift (with the exception of those with a variable argument list). The only "challenge" is to create a

UnsafePointer<UnsafeMutablePointer<Int8>?>

that can be passed as the argument list. A simple example:

import Foundation

let args = ["ls", "-l", "/Library"]

// Array of UnsafeMutablePointer<Int8>
let cargs = args.map { strdup($0) } + [nil]

execv("/bin/ls", cargs)

fatalError("exec failed")

Here it is used that you can pass a Swift string to the C function strdup() which expects a const char *, and the compiler creates a temporary UTF-8 representation (see String value to UnsafePointer<UInt8> function parameter behavior).

Comments