コンソールからの成功にもかかわらず、一部の引数を指定してコマンドを呼び出すと機能するが、他の引数では機能しない
このコード スニペットは、コマンド / を使用して 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")
は、シェルでコマンド top "-o cpu" "-n 10" "-l 2" を使用するのと同じです。ほとんどのコマンドは、この形式の引数を厳密に解析します。したがって、top は最初のオプションとして -o cpu を分割し、残りを引数として残します。これは数値引数に対しては機能しますが、「cpu」という名前のフィールドを検索すると失敗し、エラーが発生します。
この問題を解決するには、引数を次のように区切ります:
cmd := exec.Command(app, "-o", "cpu", "-n", "10", "-l", "2")
以上がコンソールからは同じコマンドが機能するのに、Go コードが特定の引数を指定した「top」コマンドの実行に失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。