【问题标题】:Writing to CON (Windows console) doesn't print to STDOUT (console)写入 CON(Windows 控制台)不会打印到 STDOUT(控制台)
【发布时间】:2020-09-01 08:24:57
【问题描述】:

我了解到CON 名称等同于 Linux 中的/dev/tty
但是当我使用一个写入这个文件的程序时,它不会打印任何东西,它只能在 Linux 上运行。
我认为我没有正确使用它。
重要提示:我不是在寻找像 fmt.Println 这样的解决方法,我需要能够打印到这个文件,就像我在 Linux 中所做的那样 (@ 987654325@)。

这是程序:

package main

import (
    "fmt"
    "os"
    "runtime"
)


func main() {

    var ttyName string
    if runtime.GOOS == "windows" {
        fmt.Println("*** Using `con`")
        ttyName = "con"
    } else {
        fmt.Println("*** Using `/dev/tty`")
        ttyName = "/dev/tty"
    }

    f, _ := os.OpenFile(ttyName, os.O_WRONLY, 0644)

    fmt.Fprintln(f, "*** Stdout redirected")
}   

程序在 Linux 中打印 "*** Stdout redirected",但在 Windows 中不打印。
问题与ttyName有关。
我用了con 作为名字,但它似乎不起作用。
我也试过:"con:""\\\\.\\con""\\\\.\\con:""\\\\?\\con"conout

如何使用它打印到控制台?

我从这个网站获得了一些想法:
https://www.mkssoftware.com/docs/man5/dev_console.5.asp

【问题讨论】:

    标签: go console stdout tty


    【解决方案1】:

    确保您使用 Windows 命令提示符对此进行测试,因为 CON 可能无法按预期使用 3rd 方终端仿真器(如 IDE、Hyper.js 中的嵌入式仿真器等)。

    您列出的选项应该可以使用,CON(旧 DOS 名称)或 \\.\CON(UNC 名称)大写是安全的选择:

    f, _ := os.OpenFile("CON", os.O_WRONLY, 0644) 
    f, _ := os.OpenFile("\\\\.\\CON", os.O_WRONLY, 0644)
    

    【讨论】:

    • 你在命令提示符下试过了吗?众所周知,写入 CON 在各种第 3 方终端仿真器中行为不端。
    • 是的,没错,它可以在控制台上运行 ("CON")。有趣的是为什么它在 Goland IDE 控制台上不起作用。
    • @E235 我认为那些第 3 方终端做了一些奇怪的事情来使 Windows 控制台表现得像伪 tty,因为默认情况下,提供控制台 API 的 Windows 组件 ConHost 表现不同(不支持相同的转义等)
    • @balmi Weird,因为在 Linux 上它也适用于 Goland IDE。
    • @E235 如果你有兴趣,有很多关于所有这些差异的系列文章here
    猜你喜欢
    • 2012-02-07
    • 2015-05-04
    • 2016-11-19
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多