lau*_*ent 7 macos vim system process go
我有一个用Golang编写的命令行工具,我需要从它启动vim.然而,它不起作用,并没有任何错误或其他许多工作.我已经将代码简化为:
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("vim", "test.txt")
err := cmd.Run()
fmt.Println(err)
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我可以看到vim进程2-3秒,但应用程序实际上没有打开.然后程序简单退出(并且vim进程关闭),退出状态为1.
我也尝试过捕获stderr:
package main
import (
"bytes"
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("vim", "test.txt")
var stderr bytes.Buffer
cmd.Stderr = &stderr
err := cmd.Run()
fmt.Println(err)
fmt.Println(stderr)
}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,程序会无限期地被卡住.
知道可能是什么问题吗?
Nic*_*ood 16
传入stdin
和stdout
传出调用程序,只要它从终端(可能是命令行程序)运行,它将为您启动vim并在用户完成文件编辑后返回控制权.
package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
cmd := exec.Command("vim", "test.txt")
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
err := cmd.Run()
fmt.Println(err)
}
Run Code Online (Sandbox Code Playgroud)
VIM需要一个合适的终端,并检测到没有终端.
如果您StderrPipe
在vim运行时使用并阅读它,您将看到:
2014/02/02 20:25:49 Vim: Warning: Output is not to a terminal
2014/02/02 20:25:49 Vim: Warning: Input is not from a terminal
Run Code Online (Sandbox Code Playgroud)
执行(正在播放)时读取stderr的示例:
func logger(pipe io.ReadCloser) {
reader := bufio.NewReader(pipe)
for {
output, err := reader.ReadString('\n')
if err != nil {
log.Println(err)
return
}
log.Print(string(output))
}
}
pipe, err := cmd.StderrPipe()
go logger(pipe)
cmd.Run()
Run Code Online (Sandbox Code Playgroud)
要让vim运行,您可能需要模拟终端.
tty := term.NewTTY(os.Stdin)
cmd := exec.Command("vim", "test.txt")
cmd.Stdin = t
cmd.Stdout = t
// ...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1580 次 |
最近记录: |