ホームページ >バックエンド開発 >Golang >コンソールからは同じコマンドが機能するのに、Go コードが特定の引数を指定した「top」コマンドの実行に失敗するのはなぜですか?

コンソールからは同じコマンドが機能するのに、Go コードが特定の引数を指定した「top」コマンドの実行に失敗するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-22 07:16:26958ブラウズ

Why Does My Go Code Fail to Execute the `top` Command with Certain Arguments While the Same Command Works from the Console?

コンソールからの成功にもかかわらず、一部の引数を指定してコマンドを呼び出すと機能するが、他の引数では機能しない

このコード スニペットは、コマンド / を使用して 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。