2014-10-28 82 views
2

我試圖運行以下兩個慶典在Cocoa程序命令:NSTask與違約和killall的bash命令

defaults write com.apple.finder CreateDesktop false 
killall Finder 

使用NSTask,我有以下的銀行代碼執行命令時,按鈕被點擊:

let commands = ["-c", "defaults write com.apple.finder CreateDesktop false", 
       "-c", "killall Finder"] 

let task = NSTask() 
task.launchPath = "/bin/bash" 
task.arguments = commands 
task.launch() 

運行代碼時我沒有收到任何錯誤。但是當按鈕被點擊時沒有任何事情發生。有什麼建議麼?

回答

1

Are you sure nothing happen?你不能像這樣將多個-c參數傳遞給Bash,但是當我嘗試時,我的確會執行第一個命令。

$ bash -c 'echo foo' -c 'echo bar' 
foo 

在這種特殊情況下,解決方法很簡單;

$ bash -c 'echo foo; echo bar' 
foo 
bar 

更一般地說,傳遞給Bash的單個命令根本不需要shell。爲了殺死Finder,

task.launchPath = "/usr/bin/killall" 
task.arguments = [ "Finder" ] 

但是假設你有多個命令,從shell運行它們確實很有意義。

let task = NSTask() 
task.launchPath = "/bin/bash" 
task.arguments = ["-c", 
    "defaults write com.apple.finder CreateDesktop false; killall Finder"] 
task.launch() 
+0

使用';'工作作爲一行運行命令。顯然,你必須將多行作爲參數數組中的一個字符串。例如''「-c」,「command 1; command 2; command 3」]'會運行所有的命令。所以,如果你有很多命令,最好是將所有這些命令放在shell腳本中,然後從應用程序運行該shell腳本? – wigging 2014-10-28 17:24:20

+0

模塊化是好的,但取決於外部腳本增加了另一種複雜性。如果它只是一些命令的序列,那麼現在我會將它們保存在一個硬編碼的字符串中。對於它的價值,換行符也是有效的命令終止符。 – tripleee 2014-10-28 17:53:37

+0

噢,如果這是一種涉及任何特權的情況,那麼五十一個醜陋的小子進程比暴露外殼的攻擊表面要好得多。 – tripleee 2014-10-28 18:14:39