为了账号安全,请及时绑定邮箱和手机立即绑定

是否有可能检测作家是否是tty?

是否有可能检测作家是否是tty?

Go
牧羊人nacy 2022-09-26 15:45:12
Bash有一个“神奇的行为”,如果你输入“ls”,通常你会得到彩色的输出,但如果你将输出重定向到一个文件,颜色代码就会消失。如何使用Go实现此效果。例如,带有以下声明:fmt.Println("\033[1;34mHello World!\033[0m")我可以看到彩色文本,但是如果我通过管道将输出传输到文件,则会保留颜色,这不是我想要的。顺便说一句,这个问题大多与Go无关,我只是想在我的Go程序中实现效果。
查看完整描述

1 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

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


这不是 Bash 功能,而是 ls 功能。它调用 isatty() 来检查标准文件描述符是否引用了终端。在 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")

        }

}


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号