Swift 执行终端命令时无法访问文件

Swift 执行终端命令时无法访问文件,swift,macos,shell,terminal,swift4,Swift,Macos,Shell,Terminal,Swift4,我正在尝试访问我的计算机上的一个文件,这样我就可以从我的Swift应用程序中使用终端来操作它。这是我的密码: static func getImageText() { print(NSHomeDirectory()) let desktop = "" shell("pwd") shell("cd ~") shell("pwd") shell("convert \(desktop)hqTriviaMasterTemp.jpg -type Gra

我正在尝试访问我的计算机上的一个文件,这样我就可以从我的Swift应用程序中使用终端来操作它。这是我的密码:

static func getImageText()
{   
    print(NSHomeDirectory())
    let desktop = ""
    shell("pwd")
    shell("cd ~")
    shell("pwd")
    shell("convert \(desktop)hqTriviaMasterTemp.jpg -type Grayscale \(desktop)hqTriviaMasterTemp.tif")
//        shell("convert", "\(desktop)hqTriviaMasterTemp.jpg", "-type Grayscale", "\(desktop)hqTriviaMasterTemp.tif")
//        shell("tesseract", "-l eng", "hqTriviaMasterTemp.jpg", "output")
}

@discardableResult
private static func shell(_ args: String...) -> Int32 {
    let task = Process()
    task.launchPath = "/usr/bin/env"
    task.arguments = args
    task.launch()
    task.waitUntilExit()
    return task.terminationStatus
}
当我运行上述代码时,shell将打印以下内容:

/Users/danielsmith
/Users/danielsmith/Library/Developer/Xcode/DerivedData/HQ_Trivia_Master-daqkzxblkgidgagayyifolcqwtwt/Build/Products/Release
env: cd ~: No such file or directory
/Users/danielsmith/Library/Developer/Xcode/DerivedData/HQ_Trivia_Master-daqkzxblkgidgagayyifolcqwtwt/Build/Products/Release env: convert hqTriviaMasterTemp.jpg -type Grayscale hqTriviaMasterTemp.tif: No such file or directory

真正让我搞砸的是,我不能在任何地方刻录cd,这妨碍了我操作我想要操作的文件。如何使cd工作,以便我可以执行我需要执行的操作?

在终端中,在运行实际命令之前,Bash shell会完成tilde
~
扩展(到您的主目录)。但是,当使用
Process
时,所有命令都是直接运行的,根本不需要经过shell—即使使用
“/usr/bin/env”

因此,您可以尝试替换此行:

shell("cd ~")
与:

但不幸的是,这也不够;)这只会更改该
进程
实例中的当前目录。您的下一个命令仍将在上一个目录上运行

实际需要做的是使用
进程设置当前目录。currentDirectoryURL
属性:

如果未使用此属性,则当前目录将从创建
进程
对象的进程继承

例如:

let task = Process()
...
task.currentDirectoryURL = URL(fileURLWithPath: NSHomeDirectory())

然后最后运行所需的命令

虽然cd不再给我一个错误,但是shell没有改变目录。现在它说我在正确的目录中,但是当我试图操作该目录中的文件时,它说“没有这样的文件或目录”。当我通过常规终端调用命令时,它工作正常。@DaniM.Smith尝试像这样运行您的命令
shell(“convert”、“foo”、“bar”)
(而不是作为单个字符串)。我尝试了以下操作:shell(“convert”、“hqTriviaMasterTemp.jpg”、“type”、“Grayscale”、“hqTriviaMasterTemp.tif”)。它返回错误代码127,并使用
convert
实用程序的完整路径打印:env:convert:No这样的文件或目录try。要找到绝对路径,只需在终端中运行转换的
let task = Process()
...
task.currentDirectoryURL = URL(fileURLWithPath: NSHomeDirectory())