登录
首页 >  Golang >  Go问答

如何判断 writer 是否为 tty?

来源:stackoverflow

时间:2024-02-16 09:09:25 423浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《如何判断 writer 是否为 tty?》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

bash 有一个“神奇的行为”,如果你输入“ls”,通常你会得到彩色的输出,但是如果你将输出重定向到一个文件,颜色代码就会消失。如何使用go实现这种效果。例如声明如下:

fmt.Println("\033[1;34mHello World!\033[0m")

我可以看到彩色文本,但如果我通过管道将输出传输到文件,则颜色将保留,这不是我想要的。

顺便说一句,这个问题大多与 go 无关,我只是想在我的 go 程序中实现这个效果。


正确答案


bash 有一个“神奇的行为”,如果你输入“ls”,通常你会 获得彩色输出,但如果将输出重定向到文件, 颜色代码消失了。

这不是 bash 功能,而是 ls 功能。它调用 isatty() 检查 stdout 文件描述符是否引用终端。在 musl libc 中 isatty 的实现方式如下:

int isatty(int fd)
{
        struct winsize wsz;
        unsigned long r = syscall(sys_ioctl, fd, tiocgwinsz, &wsz);
        if (r == 0) return 1;
        if (errno != ebadf) errno = enotty;
        return 0;
}

您可以在 go 中使用相同的方法:

package main

import (
        "fmt"
        "os"

        "golang.org/x/sys/unix"
)

func main() {
        _, err := unix.ioctlgetwinsize(int(os.stdout.fd()), unix.tiocgwinsz)
        if err != nil {
                fmt.println("hello world")
        } else {
                fmt.println("\033[1;34mhello world!\033[0m")
        }
}

我只是通过复制@ptx评论来回答,这是更规范的答案:

这是为了提高可见性,因为这个答案是可移植的并且不会添加外部依赖项。

package main

import (
    "os"
    "golang.org/x/term"
)

func main() {
    if term.IsTerminal(int(os.Stdout.Fd())) {
        // do stuff when we are attached to a tty
    } else {
        // do stuff when we are not attached
    }
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>