嗨,我正在运行一个go程序,它根据执行情况以两种方式提供一些输出:
现在我想确定程序是否在终端运行**来决定输出的模式.在Linux中有什么方法可以确定这个条件吗?目前该程序是输出在两个标准输出和通知,我想只有通过通知发送输出时,它是通过键盘快捷键调用。因为当stdout不在终端中运行时,打印到stdout是毫无用处的。
j8yoct9x1#
我假设当它通过键盘快捷键调用时,它以某种方式由桌面环境运行,输出不会是终端,所以你可以检查whether stdout is a tty or not。基于Arkadiusz Drabczyk's answer,可以使用以下代码:
package mainimport ( "os" "golang.org/x/sys/unix")func main() { _, err := unix.IoctlGetWinsize(int(os.Stdout.Fd()), unix.TIOCGWINSZ) if err != nil { // Show notification here } else { // Print to stdout here }}
package main
import (
"os"
"golang.org/x/sys/unix"
)
func main() {
_, err := unix.IoctlGetWinsize(int(os.Stdout.Fd()), unix.TIOCGWINSZ)
if err != nil {
// Show notification here
} else {
// Print to stdout here
}
**请注意,当使用|或>重定向时,这也会导致它使用通知而不是标准输出。**如果这不好,您将不得不使用显式命令行参数-我个人更喜欢这种方式,因为它清楚地传达了意图,不会有意外。你可以接受一个参数--notification,你可以将它添加到键盘快捷键中,但在命令行中调用工具时不使用它。
|
>
--notification
如果出于某种原因添加参数不方便,您也可以使用具有不同名称的符号链接并检查os.Args[0]。例如,如果你的程序是~/bin/hello,那么你会创建一个名为~/bin/hello-notify的“第二个版本”,它实际上只是~/bin/hello的符号链接,但是在你的代码中,你会检查你的os.Args[0]是否以-notify结尾。然后,您可以将键盘快捷键连接到~/bin/hello-notify,但在命令行中使用~/bin/hello。
os.Args[0]
~/bin/hello
~/bin/hello-notify
-notify
1条答案
按热度按时间j8yoct9x1#
我假设当它通过键盘快捷键调用时,它以某种方式由桌面环境运行,输出不会是终端,所以你可以检查whether stdout is a tty or not。基于Arkadiusz Drabczyk's answer,可以使用以下代码:
**请注意,当使用
|
或>
重定向时,这也会导致它使用通知而不是标准输出。**如果这不好,您将不得不使用显式命令行参数-我个人更喜欢这种方式,因为它清楚地传达了意图,不会有意外。你可以接受一个参数--notification
,你可以将它添加到键盘快捷键中,但在命令行中调用工具时不使用它。如果出于某种原因添加参数不方便,您也可以使用具有不同名称的符号链接并检查
os.Args[0]
。例如,如果你的程序是~/bin/hello
,那么你会创建一个名为~/bin/hello-notify
的“第二个版本”,它实际上只是~/bin/hello
的符号链接,但是在你的代码中,你会检查你的os.Args[0]
是否以-notify
结尾。然后,您可以将键盘快捷键连接到~/bin/hello-notify
,但在命令行中使用~/bin/hello
。