Go 如何跨平台获取控制终端

Go 如何跨平台获取控制终端,go,terminal,console,Go,Terminal,Console,我正在寻找一种跨平台的方式来访问Go中的控制终端: 在unix上,我可以打开/dev/tty: tty, err := os.OpenFile("/dev/tty", os.O_RDONLY, 0) 并从tty读取 如何在Windows中读取控制终端?Windows没有与Unix相同的终端概念,也没有作业控制的概念(因此也没有与控制终端相关的前台和后台进程)。Windows的控制台模拟MS-DOS的命令提示符,因此根据定义,它是一个单进程无任何设置。但真正的问题是:你想解决

我正在寻找一种跨平台的方式来访问Go中的控制终端:

在unix上,我可以打开
/dev/tty

tty, err := os.OpenFile("/dev/tty", os.O_RDONLY, 0)
并从
tty
读取


如何在Windows中读取控制终端?

Windows没有与Unix相同的终端概念,也没有作业控制的概念(因此也没有与控制终端相关的前台和后台进程)。Windows的控制台模拟MS-DOS的命令提示符,因此根据定义,它是一个单进程无任何设置。但真正的问题是:你想解决什么问题?我的意思是,它看起来像是一个。让我详细说明一下,这样我的回答听起来就不会油嘴滑舌:在终端/控制台上运行的进程通常连接到终端,因此不需要跳任何舞蹈来“从控制终端读取”——只需从
os.Stdin
读取,并在执行此操作时处理任何错误。如果你需要能够弄脏终端(切换其模式等),那完全是另一回事,它不会是跨平台的开箱即用。所以我们需要一个更狭义的问题陈述来帮助您。我正在重写一个钩子管理器,并在钩子由git运行时实现一个提示。最好知道,当钩子在Windows上由git运行时,是否有办法获得“控制”终端。从git运行hook时,stdin通常(hook specfific)不会连接到unix上的终端。因此,我不能仅仅从
os.Stdin
读取数据。好的,我想我明白了。如前所述,您可能需要执行som装箱以尝试连接到父进程的控制台,然后可能会将
os.Stdin
设置为对控制台分配调用之一获得的句柄上的
os.NewFile
调用的结果。还要注意的是,你可能需要询问GfW背后的人关于这个问题:我倾向于认为,在Windows上可能会比乍一看更奇怪。