2017-02-05 200 views
1

當我直接在終端中輸入時 - 它按預期方式工作,並且如果應用程序未運行則返回,如果沒有運行,則返回。終端命令無法識別?

lsappinfo list | grep -v grep | grep bundleID | grep com.test.myapp | wc -l

但是,當我使用下面的代碼(swift 3 - macOS)時,它說這是一個無法識別的命令?

// DECLARE TASK 
    let task = Process() 

    // DEFINE THE PATH 
    task.launchPath = "/usr/bin/lsappinfo" 

    // DEFINE THE ARGUMENTS 
    task.arguments = ["list | grep -v grep | grep bundleID | grep com.test.myapp | wc -l"] 

    // DECLARE outputPipe 
    let outputPipe = Pipe() 

    // RUN THE TASK 
    task.launch() 

    // DECLARE data 
    let data = outputPipe.fileHandleForReading.readDataToEndOfFile() 

    // DECLARE output AS THE UTF-8 STRING OF THE TERMINAL'S OUTPUT 
    let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue) 
     print(output!) 

    if output == "0" { 
     print("App is not running!") 

    } else { 
     print("App is running!") 
    } 

    // PAUSE UNTIL COMPLETED 
    task.waitUntilExit() 

是否有人可以告訴我在哪裏出了問題,因爲我是新來的斯威夫特,並且仍然在努力讓我的頭周圍的語言/語法。

謝謝大家提前。

+0

查看'NSWorkspace'及其'runningApplications'方法,以獲得更簡單的解決方案。示例這裏http://stackoverflow.com/questions/37646605/how-can-you-get-information-such-as-users-window-for-example-using-the-nstask-c。 –

+0

感謝馬丁 - 這就像一個魅力! –

回答

1

管道操作不是進程的參數,它們是連接多個單獨進程的shell的指令。如果swift中的任務構造需要一個進程和一組命令行參數,那麼在這裏執行此操作的一種方法可能是啓動bash二進制文件,然後將-c "lsappinfo list | grep -v grep | grep bundleID | grep com.test.myapp | wc -l"作爲全套參數。這樣,你可以讓bash理清完成管道所需的東西。

+0

你打敗了我! – Grimxn

+0

@cnettel,我已經嘗試了你的建議,但是這給了我相同的錯誤信息。我只需要檢查一個外部應用程序是否正在運行,我會考慮Martin。 R的解決方案,看看我是否可以制定出如何做到這一點。謝謝你們倆! –