在swift脚本中运行shell命令



我正在寻找一个在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
}

它与内置命令一起工作,但不能处理诸如";酿造"节点";以及手动安装的其他命令。

那么我该如何解决呢?

您需要为task设置PATH环境变量。这是在您的终端中设置的,这就是为什么您可以直接执行brewnode以及其他很酷的事情,而无需指定它们的完整路径。

你可以通过以下操作在你的终端中看到这是什么设置:

echo $PATH

它会打印一些类似的东西(对我来说,它还有很多东西。这只是摘录(:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

如果您复制并粘贴echo $PATH的整个输出,并将其放入taskenvironment属性中,那么您将能够在swift脚本中使用与终端中相同的命令。

task.environment = ["PATH": "<paste the output here>"]

正如Alexander在评论中所说,另一种方法是添加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,您将看到列出的所有自制软件包。

最新更新