-1

以下のコマンドを使用してファイルにパッチを適用しようとしています

patch -p0 < <file_path>

私の runCommand 構文は次のとおりです。

func runCommand(cmd string, args ...string) error {
    ecmd := exec.Command(cmd, args...)
    ecmd.Stdout = os.Stdout
    ecmd.Stderr = os.Stderr
    ecmd.Stdin = os.Stdin
    err := ecmd.Run()
    return err
}

今、私は以下のように私のパッチコマンドを渡しています:

cmd = "patch"
args := []string{"-p0", "<",  "/tmp/file"}
err = runCommand(cmd, args...)

しかし、次のエラーが表示されます。

パッチ: **** ファイル '<' が見つかりません: そのようなファイルまたはディレクトリはありません

ここで何が欠けているのか教えてください。

4

1 に答える 1

3

ドキュメントに次の段落がありません:

C やその他の言語からの「システム」ライブラリ呼び出しとは異なり、os/exec パッケージは意図的にシステム シェルを呼び出さず、glob パターンを展開したり、シェルによって通常行われる他の展開、パイプライン、またはリダイレクトを処理したりしません。このパッケージは、C の「exec」関数ファミリーに似た動作をします。glob パターンを拡張するには、シェルを直接呼び出して危険な入力を回避するように注意するか、path/filepath パッケージの Glob 関数を使用します。環境変数を展開するには、パッケージ os の ExpandEnv を使用します。

シェルは操作の処理を担当し<ます。stdinファイルを入力として設定することも、シェルを使用することもできます。シェルを使用するには、次のようにしてください。

runCommand("/bin/sh", "patch -p0 < /tmp/file")

これは Windows では機能しないことに注意してください。ファイルを読み込んでstdin自分自身に書き込む方法は、より簡単に移植できるソリューションです。

于 2017-12-02T18:10:29.510 に答える