     public var outputPaths: [String]
 
     /// Path to the shell.
-    public var shellPath: String
+    public var shellPath: String?
 
     /// Shell script.
     public var shellScript: String?

    func plistKeyAndValue(proj: PBXProj) -> (key: CommentedString, value: PlistValue) {
        var dictionary: [CommentedString: PlistValue] = plistValues(proj: proj)
        dictionary["isa"] = .string(CommentedString(PBXShellScriptBuildPhase.isa))
        dictionary["shellPath"] = .string(CommentedString(shellPath))
        dictionary["inputPaths"] = .array(inputPaths.map({.string(CommentedString($0))}))
        if let name = name {
            dictionary["name"] = .string(CommentedString(name))

    
    public required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.name = try container.decodeIfPresent(.name)
        self.inputPaths = (try container.decodeIfPresent(.inputPaths)) ?? []
        self.outputPaths = (try container.decodeIfPresent(.outputPaths)) ?? []
        self.shellPath = try container.decodeIfPresent(.shellPath)
        self.shellScript = try container.decodeIfPresent(.shellScript)
        self.showEnvVarsInLog = try container.decodeIfPresent(.showEnvVarsInLog)
        try super.init(from: decoder)
