我正在尝试访问计算机上的文件,因此我可以使用我的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工作,以便我可以做我需要做的事情?
答案 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())
然后最后运行所需的命令。