我正在寻找一个在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
环境变量。这是在您的终端中设置的,这就是为什么您可以直接执行brew
和node
以及其他很酷的事情,而无需指定它们的完整路径。
你可以通过以下操作在你的终端中看到这是什么设置:
echo $PATH
它会打印一些类似的东西(对我来说,它还有很多东西。这只是摘录(:
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
如果您复制并粘贴echo $PATH
的整个输出,并将其放入task
的environment
属性中,那么您将能够在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
,您将看到列出的所有自制软件包。