首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从任意目录中快速运行终端命令?

如何从任意目录中快速运行终端命令?
EN

Stack Overflow用户
提问于 2020-08-23 23:01:37
回答 2查看 1.3K关注 0票数 2

我正在创建一个macOS应用程序,该应用程序允许用户运行终端命令。我能够运行一个命令,但据我所知,它是从我的应用程序中的一个目录运行的。运行pwd将返回/Users/<me>/Library/Containers/<My app's bundle identifier>/Data

如何选择命令从哪个目录运行?

我也在寻找一种让cd工作的方法,但是如果我可以选择从哪个目录运行终端命令,我可以手动处理cd

下面是我目前用于运行终端命令的代码:

代码语言:javascript
复制
func shell(_ command: String) -> String {
    let task = Process()
    let pipe = Pipe()

    task.standardOutput = 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
    
}

我在大苏尔使用Xcode 12。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-23 23:44:45

currentDirectoryPath上有一个不推荐的属性Process

假设您不想使用不推荐的属性,在将其文档头转到FileManager并查看用于管理当前目录的is条款及其含义之后。

或者使用cd,就像您已经考虑过的那样,- you启动了一个shell (zsh),其中包含一个shell命令行作为参数。命令行可以包含由分号分隔的多个命令,因此可以将cd添加到command值中。

后一种方法避免更改当前进程的当前目录。

HTH

票数 1
EN

Stack Overflow用户

发布于 2021-07-26 15:22:01

要添加CRD的答案,如果使用cd方法,还可以考虑使用&&分隔命令,等待前面的命令成功完成,然后再转到依赖于它的下一个命令。

尝试您希望在终端中运行的命令,看看它是否按照预期完成。

例:/bin/bash -c "cd /source/code/ && git pull && swift build"

如果一切按预期工作,您可以继续在您的快速代码中使用它,如下所示:

shell("cd /source/code/ && git pull && swift build")

在不推荐的主题上,您可能希望用executableURL替换launchPath,用跑()替换跑()()

使用更新代码的示例实现:

代码语言:javascript
复制
@discardableResult
func shell(_ args: String...) -> Int32 {
    let task = Foundation.Process()
    
    task.executableURL = URL(fileURLWithPath: "/bin/bash")
    task.arguments = ["-c"]
    task.arguments = task.arguments! + args
    
    //Set environment variables
    var environment = ProcessInfo.processInfo.environment
    environment["PATH"]="/usr/bin/swift"
    //environment["CREDENTIALS"] = "/path/to/credentials"
    task.environment = environment
    
    let outputPipe = Pipe()
    let errorPipe = Pipe()
    
    task.standardOutput = outputPipe
    task.standardError = errorPipe
    
    do {
        try task.run()
    } catch {
        // handle errors
        print("Error: \(error.localizedDescription)")
    }
    task.waitUntilExit()
    
    let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile()
    let errorData = errorPipe.fileHandleForReading.readDataToEndOfFile()
    
    let output = String(decoding: outputData, as: UTF8.self)
    let error = String(decoding: errorData, as: UTF8.self)
    
    //Log or return output as desired
    print(output)
    print("Ran into error while running: \(error)")
    
    return task.terminationStatus
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63552825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档