Running a Command-Line Program from a Mac App
Apple provides the Process class that lets you run Terminal commands and command-line programs inside a Mac app. If you were creating a git GUI client, such as SourceTree or Tower, you would use the Process class to run git commands from your app.
To run a command-line program from your Mac app, you must do the following:
- Create a
Processinstance - Configure the process
- Run the process
Create the Process
Creating a process is the easiest step. Call the Process class’s initializer.
let task = Process()
Configure the Process
What you must configure depends on the command or program you want to run. You must set the executable URL, the location of the command or program you want to run. Some other things you may need to configure include the following:
- Arguments to pass to the process
- The current directory
- Environment variables
- Standard error
- Standard input
- Standard output
In my help book building app Phel, I run the hiutil command to index the help book. I configure the following items to run the command:
- The executable URL, which is
usr/bin/hiutil. - The directory to run the command, which is the Resources folder inside the help book bundle.
- The arguments, which are
-I,lsm,-Caf, the name of the index file,-vv, and..
I must run the hiutil command a second time to generate a spotlight index file. I replace the lsm argument with corespotlight and supply the name of the spotlight index file.
Run the Process
Call the run function inside a do-catch block to run a process.
The following code runs the hiutil to generate an index file for an Apple help book:
// location is the URL of the help book bundle.
func createIndexFile(location: URL) {
let task = Process()
task.executableURL = URL(fileURLWithPath: "usr/bin/hiutil")
// Get to the Resources folder in the help book bundle.
let contentsFolder = location.appendingPathComponent("Contents",
conformingTo: .data)
let resourcesFolder = contentsFolder.appendingPathComponent("Resources",
conformingTo: .data)
task.currentDirectoryURL = resourcesFolder
// indexFile is the name of the file the hiutil command creates.
task.arguments = ["-I", "lsm", "-Caf", indexFile, "-vv", "."]
do {
try task.run()
} catch {
print(error)
}
}