2012-08-23 44 views
5

Tôi đang cố gắng tìm cách khởi chạy trình chỉnh sửa bên ngoài từ bên trong chương trình Go, đợi người dùng đóng trình chỉnh sửa và sau đó tiếp tục thực hiện chương trình. Dựa trên this SO trả lời, Tôi hiện đang có mã này:Cố gắng khởi chạy trình chỉnh sửa bên ngoài từ bên trong chương trình Go

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.") 
    } 

} 

Khi tôi chạy chương trình, tôi có được điều này:

[email protected]:~/code/go/src/launcheditor$ go run launcheditor.go 
2012/08/23 10:50:37 Error while editing. Error: exit status 1 
[email protected]:~/code/go/src/launcheditor$ 

Tôi cũng đã cố gắng sử dụng exec.Run() thay vì exec. Bắt đầu(), nhưng điều đó dường như không hoạt động (mặc dù nó không thất bại tại cùng một vị trí).

Tôi có thể làm cho nó hoạt động nếu tôi sử dụng Gvim thay vì Vim, nhưng nó từ chối làm việc với cả Vim và nano. Tôi nghĩ rằng nó liên quan đến Vim và nano chạy bên trong trình mô phỏng thiết bị đầu cuối thay vì tạo ra một cửa sổ bên ngoài.

Trả lời

7

Rõ ràng, bạn phải thiết lập stdin, stdout và stderr trên đối tượng Cmd để os .Std (trong | ra | err). Như thế này (giả sử rằng đối tượng được gọi là cmd):

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

Tín dụng để giải quyết vấn đề này với # go-nut trên freenode.

1

đây trong cmd := exec.Command("vim", fpath), bạn đang làm nhiều hay ít:

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

Shell sử dụng biến môi trường PATH, exec.Command không. Bạn phải tra cứu mã nhị phân vim và chuyển đường dẫn đầy đủ của nó đến exec.Command. exec.LookPath thực hiện điều đó cho bạn.

+0

Tôi đã thử nhưng vẫn không hoạt động. Ngoài ra, điều này không thể là giải thích khi sử dụng chỉ "gvim" hoạt động tốt. – cgt

+1

Đã kiểm tra. Bạn đúng. Không biết lý do nào. Nhìn vào nó. – zzzz

2

này làm việc cho tôi nhưng nó có những bất lợi của việc mở thiết bị đầu cuối khác (mà sẽ tự động đóng sau khi phiên bản):

cmd := exec.Command("/usr/bin/xterm", "-e", "vim "+fpath) 
Các vấn đề liên quan