【发布时间】:2016-09-06 15:04:44
【问题描述】:
谁能帮我弄清楚我在这里做错了什么。
我正在尝试执行一个在不同 tty 中运行的命令(在本例中打开 vim),在本例中为 /dev/ttys001,它在我的终端的另一个选项卡中打开。
运行下面的代码确实会在 /dev/ttys001 的窗口中渲染 vim,但是,实际上从该窗口输入标准输入并不能正确注册。
非常感谢任何建议!
package main
import (
"log"
"os"
"os/exec"
)
func main() {
tty, err := os.OpenFile("/dev/ttys001", os.O_RDWR, os.ModePerm)
if err != nil {
log.Fatalln(err)
}
defer tty.Close()
c := exec.Command("vim")
c.Stdin = tty
c.Stdout = tty
c.Stderr = tty
if err := c.Run(); err != nil {
log.Fatalln(err)
}
}
我也尝试使用以下代码设置命令的 SysProcAttr 字段,但收到错误:fork/exec /usr/local/bin/vim: inappropriate ioctl for device。
procAttr := &syscall.SysProcAttr{
Setpgid: true,
Ctty: int(tty.Fd()),
Foreground: true,
}
c.SysProcAttr = procAttr
【问题讨论】:
-
尝试在之后调用 c.Wait()。
-
嘿@AJPennster,我目前正在使用 c.Run 而不是 c.Start 和 c.Run 自动调用等待你。
-
啊,对了,我错过了。
-
当您在窗口中键入时会发生什么?
-
例如,通常在 vim 中,如果您只是输入字母 i,您将进入插入模式,而在这种情况下,您可以连续输入字母 i,但它只是被忽略并放置在屏幕上(实际上并不与 vim 进程交互),但有时在输入 enter 后,可能会实际执行诸如字母 i 之类的命令。不幸的是,我无法确定问题所在。