2016-12-15 13 views
0

How do I run an terminal command in a swift script? (e.g. xcodebuild)からコピー:プロセスに環境変数を設定するにはどうすればよいですか?

import Foundation 

@discardableResult 
func shell(_ args: String...) -> Int32 { 
    let task = Process() 
    task.launchPath = "/usr/bin/env" 
    task.arguments = args 
    task.launch() 
    task.waitUntilExit() 
    return task.terminationStatus 
} 

shell("ls") 
shell("xcodebuild", "-workspace", "myApp.xcworkspace") 

これがきちんと見えます。私はちょうど$PWDのような環境変数がプロセスのためにどのように設定できるのだろうかと疑問に思っています(taskここに...)。


私は次のことを試してみました:

import Foundation 

@discardableResult 
func execCommand(_ args: String...) -> Int32 { 
    let process = Process() 
    process.launchPath = "/usr/bin/env" 
    process.environment = ["PWD": "/Users"] 
    if let env = process.environment { 
     print(env["PWD"] ?? "Unknown") 
    } else { 
     print("Environment not available!") 
    } 
    process.arguments = args 
    process.launch() 
    process.waitUntilExit() 
    return process.terminationStatus 
} 


execCommand("pwd") 

そして、これらの線が印刷されました:

/Users 
/private/tmp/AppIcon.appiconset 

はどうやら環境変数が設定されていますが、すべてでpwdコマンドには影響しません。


別のアプローチ:前と

import Foundation 

@discardableResult 
func execCommand(_ args: String...) -> Int32 { 
    let process = Process() 
    process.launchPath = "/usr/bin/env" 
    var environment = ProcessInfo.processInfo.environment 
    environment["PWD"] = "/Users" //optionally set new vars, or overwrite old ones 
    process.environment = environment 
    if let env = process.environment { 
     print(env["PWD"] ?? "Unknown") 
    } else { 
     print("Environment not available!") 
    } 
    process.arguments = args 
    process.launch() 
    process.waitUntilExit() 
    return process.terminationStatus 
} 


execCommand("pwd") 

残念ながら同じ結果。

+0

https://developer.apple.com/reference/foundation/process/1409412-environment – Alexander

+0

あなたは 'Process'インスタンス' task'呼び出すべきではありません。 'NSTask'の名前が変更されました。 – Alexander

答えて

3

Processの変数environmentを、可変値と値のマッピングを含む[String: String]に設定するだけです。

let process = Process() 
// ... 
process.environment = ["home": "/Users/foo"] 

あなたは、現在の環境に渡したい場合、あなたはそのようにそれを行うことができます。

let process = Process() 
// ... 
let environment = ProcessInfo.processInfo.environment 
environment["home"] = "/Users/foo" //optionally set new vars, or overwrite old ones 
process.environment = environment 

あなたが作業ディレクトリを設定したい場合は、それは環境変数によって決定さていないのではなく、 currentDirectoryPath propertyを経由してください。

let process = Process() 
// ... 
process.currentDirectoryPath = "/Users" 
+0

ここでは何の効果もありません。 Sierra、Xcode 8.2 – qed

+0

それはどういう意味ですか? – Alexander

+0

すぐに例を掲載します。 – qed

関連する問題