儘管控制台成功,但使用某些參數呼叫命令可以工作,但其他參數則不起作用
此程式碼片段使用命令/ 輸出10 個進程的詳細資料usr/bin/top 帶有參數-n 10 和-l 2:
package main import ( "os/exec" ) func main() { print(top()) } func top() string { app := "/usr/bin/top" cmd := exec.Command(app, "-n 10", "-l 2") out, err := cmd.CombinedOutput() if err != nil { return err.Error() + " " + string(out) } value := string(out) return value }
但是,新增-o cpu 參數(例如cmd := exec.Command(app, "-o cpu", "-n 10", "-l 2"))導致錯誤:
exit status 1 invalid argument -o: cpu /usr/bin/top usage: /usr/bin/top [-a | -d | -e | -c <mode>] [-F | -f] [-h] [-i <interval>] [-l <samples>] [-ncols <columns>] [-o <key>] [-O <secondaryKey>] [-R | -r] [-S] [-s <delay>] [-n <nprocs>] [-stats <key(s)>] [-pid <processid>] [-user <username>] [-U <username>] [-u]
有趣的是,指令top -o cpu -n 10 -l 2 工作正常來自OS X 10.9.3 中的控制台。
問題是由 Go 程式碼中的參數分隔方式所造成的。以下行:
cmd := exec.Command(app, "-o cpu", "-n 10", "-l 2")
相當於在 shell 中使用指令 top "-o cpu" "-n 10" "-l 2"。大多數命令嚴格解析這種格式的參數。因此,top 將 -o cpu 作為第一個選項分離出來,並將其餘的作為其參數。這適用於數字參數,但在尋找名為“cpu”的欄位時失敗,從而導致錯誤。
要解決此問題,請如下分隔參數:
cmd := exec.Command(app, "-o", "cpu", "-n", "10", "-l", "2")
以上是為什麼我的 Go 程式碼無法執行帶有某些參數的'top”命令,而同一命令可以從控制台運行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!