Как установить переменную окружения через Zsh из скрипта Swift - PullRequest
1 голос
/ 26 января 2020

Рассмотрим следующий скрипт Swift (Shell.swift):

#!/usr/bin/swift

import Foundation

func shell(_ command: String) {
    let task = Process()
    task.launchPath = "/bin/zsh"
    task.arguments = ["-c", command]

    let pipe = Pipe()
    task.standardOutput = pipe
    task.launch()

    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output = String(data: data, encoding: .utf8) ?? ""
    print(output)
}

Если я добавлю в него эту строку (в конце):

shell("date")

... и вызвать его из моего терминала следующим образом:

$ ./Shell.swift

Вывод:

Sun Jan 26 11:35:52 CET 2020

Если я добавлю эта строка:

shell("echo $LANG")

Вывод:

en_US.UTF-8

Работает, как и ожидалось.

Теперь, если Я добавляю эти строки:

shell("export MY_VAR=123")
shell("echo $MY_VAR") ?? // Nothing is printed out

Есть ли способ сделать это?

Как установить переменную окружения с помощью Zsh из скрипта Swift?

1 Ответ

1 голос
/ 26 января 2020

Каждый вызов вашей функции shell() порождает новую оболочку Z, и установка переменной среды в первом вызове не влияет на среду второго вызова.

Вот некоторые параметры: Вы можете установить среда в скрипте zsh, которая должна быть выполнена. Пример:

shell("date")
// Sun Jan 26 11:56:25 CET 2020

shell("export TZ=UTC ; date")
// Sun Jan 26 10:56:25 UTC 2020

Или вы можете установить task.environment, добавив указанные переменные среды в среду по умолчанию:

func shell(_ command: String, addEnvironment: [String: String]? = nil) {
    let task = Process()
    task.launchPath = "/bin/zsh"
    task.arguments = ["-c", command]
    if let addEnv = addEnvironment {
        var currentEnv = ProcessInfo.processInfo.environment
        for (key, value) in addEnv {
            currentEnv[key] = value
        }
        task.environment = currentEnv
    }

    let pipe = Pipe()
    task.standardOutput = pipe
    task.launch()

    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output = String(data: data, encoding: .utf8) ?? ""
    print(output)
}

Пример:

shell("date", addEnvironment: ["TZ": "UTC"])
// Sun Jan 26 10:56:25 UTC 2020
...