是否有可能检测到写入器是否为tty ?



Bash有一个'神奇的行为',如果您输入'ls',通常会得到彩色的输出,但是如果您将输出重定向到一个文件,彩色代码就消失了。如何使用Go实现这种效果。例:

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

我可以看到文本的颜色,但如果我将输出管道到一个文件,颜色是保留的,即NOT我想要什么

BTW,这个问题主要是与围棋无关,我只是想在我的围棋程序中达到这个效果。

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

更好的方法是使用term。终端从x/term。它在windows上运行,由golang团队维护

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

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
}
}

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

这不是Bash特性,这是ls特性。它调用isatty ()检查标准输出文件描述符是否指向终端。在肌肉里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("33[1;34mHello World!33[0m")
}
}

如果您只是查看日志文件,并且不希望保留颜色,因为它使日志可读性降低,请注意

less -r logfile
more -r logfile
multitail -cT ANSI logfile

将使这些命令显示ANSI颜色。

也有一个vim插件做同样的事情:https://github.com/powerman/vim-plugin-AnsiEsc

对于某些用例,这可能是比升级应用程序来检测输出是否附加到tty更简单的解决方案。

相关内容

  • 没有找到相关文章

最新更新