nef10/shellout
Welcome to ShellOut, a simple package that enables you to easily “shell out” from a Swift script or command line tool.
Usage
Just call shellOut(), and specify what command you want to run, along with any arguments you want to pass:
let output = try shellOut(to: "echo", arguments: ["Hello world"])
print(output) // Hello worldYou can also easily run a series of commands at once, optionally at a given path:
try shellOut(to: ["mkdir NewFolder", "echo \"Hello again\" > NewFolder/File"], at: "~/CurrentFolder")
let output = try shellOut(to: "cat File", at: "~/CurrentFolder/NewFolder")
print(output) // Hello againIn case of an error, ShellOut will automatically read STDERR and format it nicely into a typed Swift error:
do {
try shellOut(to: "totally-invalid")
} catch {
let error = error as! ShellOutError
print(error.message) // Prints STDERR
print(error.output) // Prints STDOUT
}Pre-defined commands
Another way to use ShellOut is by executing pre-defined commands, that enable you to easily perform common tasks without having to construct commands using strings. It also ships with a set of such pre-defined commands for common tasks, such as using Git, manipulating the file system and using tools like Marathon, CocoaPods and fastlane.
Use Git
try shellOut(to: .gitInit())
try shellOut(to: .gitClone(url: repositoryURL))
try shellOut(to: .gitCommit(message: "A scripted commit!"))
try shellOut(to: .gitPush())
try shellOut(to: .gitPull(remote: "origin", branch: "release"))
try shellOut(to: .gitSubmoduleUpdate())
try shellOut(to: .gitCheckout(branch: "my-feature"))Handle files, folders and symlinks
try shellOut(to: .createFolder(named: "folder"))
try shellOut(to: .createFile(named: "file", contents: "Hello world"))
try shellOut(to: .moveFile(from: "path/a", to: "path/b"))
try shellOut(to: .copyFile(from: "path/a", to: "path/b"))
try shellOut(to: .openFile(at: "Project.xcodeproj"))
try shellOut(to: .readFile(at: "Podfile"))
try shellOut(to: .removeFile(from: "path/a"))
try shellOut(to: .createSymlink(to: "target", at: "link"))
try shellOut(to: .expandSymlink(at: "link"))For a more powerful and object-oriented way to handle Files & Folders in Swift, check out Files
Use Marathon
try shellOut(to: .runMarathonScript(at: "~/scripts/MyScript", arguments: ["One", "Two"]))
try shellOut(to: .updateMarathonPackages())Use The Swift Package Manager
try shellOut(to: .createSwiftPackage(withType: .executable))
try shellOut(to: .updateSwiftPackages())
try shellOut(to: .generateSwiftPackageXcodeProject())
try shellOut(to: .buildSwiftPackage())
try shellOut(to: .testSwiftPackage())Use fastlane
try shellOut(to: .runFastlane(usingLane: "appstore"))Use CocoaPods
try shellOut(to: .updateCocoaPods())
try shellOut(to: .installCocoaPods())Don't see what you're looking for in the list above? You can easily define your own commands using ShellOutCommand. If you've made a command you think should be included among the built-in ones, feel free to open a PR!
Installation
For scripts
- Install Marathon.
- Add ShellOut to Marathon using
$ marathon add https://github.com/JohnSundell/ShellOut.git. - Alternatively, add
https://github.com/JohnSundell/ShellOut.gitto yourMarathonfile. - Write your script, then run it using
$ marathon run yourScript.swift.
For command line tools
- Add
.package(url: "https://github.com/JohnSundell/ShellOut.git", from: "2.0.0")to yourPackage.swiftfile'sdependencies. - Update your packages using
$ swift package update.
Help, feedback or suggestions?
- Open an issue if you need help, if you found a bug, or if you want to discuss a feature request.
- Open a PR if you want to make some change to ShellOut.
- Contact @johnsundell on Twitter for discussions, news & announcements about ShellOut & other projects.
Package Metadata
Repository: nef10/shellout
Default branch: master
README: README.md