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

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

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

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

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


牧羊人nacy
浏览 89回答 1
1回答

当年话下

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 mainimport (        "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")        }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go