11

Goプログラム内から外部エディターを起動し、ユーザーがエディターを閉じるのを待ってから、プログラムの実行を続行する方法を理解しようとしています。このSOの回答に基づいて、私は現在このコードを持っています:

package main

import (
    "log"
    "os"
    "os/exec"
)

func main() {
    fpath := os.TempDir() + "/thetemporaryfile.txt"
    f, err := os.Create(fpath)
    if err != nil {
        log.Printf("1")
        log.Fatal(err)
    }
    f.Close()

    cmd := exec.Command("vim", fpath)
    err = cmd.Start()
    if err != nil {
        log.Printf("2")
        log.Fatal(err)
    }
    err = cmd.Wait()
    if err != nil {
        log.Printf("Error while editing. Error: %v\n", err)
    } else {
        log.Printf("Successfully edited.")
    }

}

プログラムを実行すると、次のようになります。

chris@DPC3:~/code/go/src/launcheditor$ go run launcheditor.go 
2012/08/23 10:50:37 Error while editing. Error: exit status 1
chris@DPC3:~/code/go/src/launcheditor$ 

exec.Run()の代わりに使用してみましたがexec.Start()、それもうまくいかないようです(同じ場所で失敗することはありませんが)。

Vimの代わりにGvimを使用すれば動作させることができますが、Vimとnanoの両方で動作することを拒否します。これは、外部ウィンドウを作成するのではなく、ターミナルエミュレーター内で実行されるVimとnanoに関連していると思います。

4

3 に答える 3

14

どうやら、あなたは、を設定する必要がStdinありStdoutStderrオブジェクト上Cmdos.Std(in|out|err)。このように(オブジェクトが呼び出されると仮定してcmd):

cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr

これを解決した功績は、freenodeの#go-nutsのメンバーに与えられます。

于 2012-08-23T10:51:24.183 に答える
3

これは私にとってはうまくいきますが、別の端末を開くという欠点があります(編集後に自動的に閉じます):

cmd := exec.Command("/usr/bin/xterm", "-e", "vim "+fpath)
于 2012-08-23T09:19:07.567 に答える
1

ここではcmd := exec.Command("vim", fpath)、多かれ少なかれやっています:

$ PATH= vim foo.txt
bash: vim: No such file or directory
$

シェルはPATH環境変数を使用しますが、使用exec.Commandしません。バイナリを検索し、vimそのフルパスをに渡す必要がありexec.Commandます。exec.LookPathがそれを行います。

于 2012-08-23T09:13:45.297 に答える