终端测试命令在Swift

时间:2015-12-23 11:06:18

标签: swift macos shell cocoa

当我在终端上或作为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:是一个目录

有人可以帮忙吗?

1 个答案:

答案 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)