gpt4 book ai didi

swift - 在 swift 脚本中运行 shell 命令

转载 作者:行者123 更新时间:2023-12-04 07:24:20 32 4
gpt4 key购买 nike

我正在寻找一种在 Swift 脚本中运行 shell 命令的解决方案。
这是我的代码:

func shellEnv(_ command: String) -> String {
let task = Process()
let pipe = Pipe()

task.standardOutput = pipe
task.standardError = pipe
task.arguments = ["-c", command]
task.launchPath = "/bin/zsh"
task.launch()

let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = String(data: data, encoding: .utf8)!

return output
}
它适用于内置命令,但无法处理诸如“brew”、“node”和其他手动安装的命令之类的命令。
那么我该如何解决呢?

最佳答案

您需要设置 PATH task 的环境变量.这已在您的终端中设置,这就是为什么您可以执行 brewnode和其他很酷的东西直接,没有指定它们的完整路径。
您可以通过执行以下操作来查看终端中的设置:

echo $PATH
它会打印出类似的东西(对我来说它还有很多东西。这只是摘录):
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
如果复制并粘贴 echo $PATH 的整个输出,并将其放入 environment task 的属性(property),那么您将能够在 swift 脚本中使用与终端中相同的命令。
task.environment = ["PATH": "<paste the output here>"]
正如亚历山大在 comments 中所说的那样,另一种方法是添加 l选项。这是一个 MCVE:
#!/usr/bin/swift

// main.swift
import AppKit

func shellEnv(_ command: String) -> String {
let task = Process()
let pipe = Pipe()

task.standardOutput = pipe
task.standardError = pipe
task.arguments = ["-cl", command]
task.launchPath = "/bin/zsh"
task.launch()

let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = String(data: data, encoding: .utf8)!

return output
}

print(shellEnv("brew list")) // assuming you have brew
运行, chmod +x main.swift然后 ./main.swift ,您将看到列出的所有自制软件包。

关于swift - 在 swift 脚本中运行 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68300352/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com