是否可以检测作者是否为 tty?
Is it possible to detect if a writer is tty or not?
Bash 有一个 'magical behavior',如果你输入 'ls',通常你会得到彩色输出,但如果你将输出重定向到一个文件,颜色代码就消失了。如何使用 Go 实现这种效果。例如使用以下语句:
fmt.Println("3[1;34mHello World!3[0m")
我可以看到彩色文本,但如果我将输出通过管道传输到文件,颜色会保留,即NOT我想要的
顺便说一句,这个问题大部分与Go无关,我只是想在我的go程序中实现效果。
Bash has a 'magical behavior', if you type 'ls', usually you will
get colorful output, but if you redirect the output to a file, the
color codes are gone.
这不是 Bash 功能,而是 ls 功能。它叫
isatty()
检查 stdout 文件描述符是否指向终端。在音乐库中
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("3[1;34mHello World!3[0m")
}
}
Bash 有一个 'magical behavior',如果你输入 'ls',通常你会得到彩色输出,但如果你将输出重定向到一个文件,颜色代码就消失了。如何使用 Go 实现这种效果。例如使用以下语句:
fmt.Println("3[1;34mHello World!3[0m")
我可以看到彩色文本,但如果我将输出通过管道传输到文件,颜色会保留,即NOT我想要的
顺便说一句,这个问题大部分与Go无关,我只是想在我的go程序中实现效果。
Bash has a 'magical behavior', if you type 'ls', usually you will get colorful output, but if you redirect the output to a file, the color codes are gone.
这不是 Bash 功能,而是 ls 功能。它叫 isatty() 检查 stdout 文件描述符是否指向终端。在音乐库中 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("3[1;34mHello World!3[0m")
}
}