当我在终端上或作为shell脚本运行以下shell命令时:
test -f test.dmg && rm test.dmg
输出:删除test.dmg,如果存在于当前目录中。
但是,在swift中运行与下面相同的命令时,它无法正常工作:
#!/usr/bin/env xcrun swift
func shell(launchPath: String, arguments: [AnyObject] = []) -> String? {
let task = NSTask()
task.launchPath = launchPath
task.arguments = (arguments as! [String])
print(task.arguments)
let pipe = NSPipe()
task.standardOutput = pipe
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = NSString(data: data, encoding: NSUTF8StringEncoding)
print(output)
return (output as! String)
}
let arguments = ["test", "-f", "test.dmg", "&&", "rm", "test.dmg"]
shell("/bin/sh", arguments)
使用swift输出: test:test:是一个目录
有人可以帮忙吗?
答案 0 :(得分:2)
这里有两个问题。
错误的原因是因为当前目录中有一个test
目录,并且(由于第二个错误)shell试图将其作为脚本执行并失败。
第二个错误是你没有将命令传递给shell直接作为独立参数运行。
那就是你不这样做:
/bin/sh test -f test.dmg && rm test.dmg
您所做的是将-c
标志用于shell并将整个命令作为单个字符串传递给它:
/bin/sh -c 'test -f test.dmg && rm test.dmg'
这将使你的代码像这样:
let arguments = ["-c" "test -f test.dmg && rm test.dmg"]
shell("/bin/sh", arguments)