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

时间:2017-11-02 02:41:07

标签: 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 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工作,以便我可以做我需要做的事情?

1 个答案:

答案 0 :(得分:1)

在终端中,代码~扩展(到您的主目录)由Bash shell 运行您的实际命令之前完成。但是,使用Process时,即使使用"/usr/bin/env",所有命令都可以直接运行而无需通过shell。

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

shell("cd ~")

使用:

shell("cd", NSHomeDirectory())

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

您实际需要做的是使用Process.currentDirectoryURL属性设置当前目录:

  

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

例如:

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

然后最后运行所需的命令。