微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在执行命令中使用管道?

如何解决如何在执行命令中使用管道?

我有一个类似的表达

xattr -p com.apple.Metadata:_kMDItemUserTags '/Users/Shared/MeinDesktop/fasttemp/Fotos noch einzusortieren/_ORG/Foto.jpg' | xxd -r -p | plutil -convert json - -o -

我想在我的应用程序中执行它。所以我尝试了

func readLabels(_ filePath : String) -> String {
    return shell(launchPath: "/usr/bin/xattr",arguments: ["-p","com.apple.Metadata:_kMDItemUserTags",filePath," | xxd -r -p | plutil -convert json - -o -" ] )
} 

使用我的帮助功能执行命令:

func shell(launchPath: String,arguments: [String]) -> String
{
    let task = Process()
    task.launchPath = launchPath
    task.arguments  = arguments
    let pipe = Pipe()
    task.standardOutput = pipe
    task.standardError = pipe   

    do {
        try task.run()
    } catch let error as NSError {
        print(error.localizedDescription)
        return ""
    }

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

这适用于参数的第一部分,直到管道符号。 使用额外的参数,错误是:

xattr: No such file:  | xxd -r -p | plutil -convert json - -o -

我需要做什么才能使这成为要执行的完整语句?我不想创建命令文件,执行它,然后再次删除它。它应该像所有“正常”命令一样工作,并从 std io 传递返回文本,该文本将由我的 shell 函数获取

我使用的是 Xcode 12.4 和 macOS 11.2。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。