Latest 2.1.2
License MIT
Platforms osx 10.10, requires ARC
Dependencies PathKit

🧪 Shell

Shell is a µ-library written Swift to run shell tasks.

Swift Package Manager
Code Coverage

Install 🛠

Swift Package Manager

Add the dependency in your Package.swift file:

let package = Package(
    name: "myproject",
    dependencies: [
        .package(url: "", .upToNextMajor(from: "2.1.2")),
    targets: [
            name: "myproject",
            dependencies: ["Shell"]),


Add the following line to your project Podfile:

pod "Shell", "2.1.2"
pod "ShellTesting", "2.1.2"
pod "RxShell", "2.1.2"


Add the following line to your project Cartfile:

github "tuist/shell" "2.1.2"


If you want to use Shell in a Marathon script, either add it to your Marathonfile (see the Marathon repo for instructions on how to do that), or point Marathon to Shell using the inline dependency syntax:

import Shell //

Usage 🚀

To run commands in the system, you need to create an instance of Shell:

let shell = Shell()

Shell exposes methods for running the commands synchronously, asynchronously, and capturing the output:

// Synchronous running
let result = shell.sync(["xcodebuild", "-project", "Shell", "-scheme", "Shell"])

// Asynchronous running
shell.async(["xcodebuild", "-project", "Shell", "-scheme", "Shell"]) { result in
  // Process the result

// Capturing output
let result = shell.capture(["xcode-select", "-p"])

Testing ✅

We understand how inconvenient testing might be in Swift and thus, we designed Shell’s API to facilitate testing by avoiding many syntactic sugar and static interfaces. The library comes with a library, ShellTesting that you can import in your tests target to mock the Shell interface and stub the result of running commands:

import ShellTesting

let mock = Shell.mock()
let xcodebuild = XcodeBuild(shell: mock)

shell.succeed(["xcodebuild", "-project", "Shell.xcodeproj", "-scheme", "Shell"])

XCTAssertNoThrow(try "Shell.xcodeproj", scheme: "Shell"))

RxShell 💃

Shell comes with a package, RxShell that adds a reactive extension using RxSwift to the interface of Shell.["xcodebuild", "-project", "Shell", "-scheme", "Shell"]).subscribe {
  print("Compilation completed")

Setup for development 👩‍💻

  1. Git clone: [email protected]:tuist/shell.git
  2. Generate Xcode project with swift package generate-xcodeproj.
  3. Open Shell.xcodeproj.
  4. Have fun 🤖

Open source

Tuist is a proud supporter of the Software Freedom Conservacy

Become a Conservancy Supporter!

Latest podspec

    "name": "Shell",
    "version": "2.1.2",
    "summary": "Shell is a u00b5-library written Swift to run system commands",
    "homepage": "",
    "social_media_url": "",
    "license": "MIT",
    "source": {
        "git": "",
        "tag": "2.1.2"
    "requires_arc": true,
    "authors": "Tuist",
    "swift_version": "5.0",
    "platforms": {
        "osx": "10.10"
    "source_files": "Sources/Shell/**/*.{swift}",
    "dependencies": {
        "PathKit": [

Pin It on Pinterest

Share This