嗨,我正在工作的一个围棋程序,它提供了一些输出在两种方式取决于执行:

  • 如果是executed in the terminal,则输出为stdout
  • 它与键盘快捷键(例如,Ctrl+M),如果是invoked via keyboard shortcut,则发送output as notification.

现在我想要determine是否program is running in the terminal or not来决定输出的方式…在Linux中有什么方法可以确定这种情况吗?

目前程序输出标准输出和通知,我想只发送输出通过通知时,它是通过键盘快捷键调用.因为当stdout不在终端中运行时打印到stdout是毫无用处的.

推荐答案

我假设当它通过键盘快捷键调用时,它是由您的桌面环境以某种方式运行的,并且输出不会是终端,所以您可以勾选whether stdout is a tty or not.基于Arkadiusz Drabczyk's answer,您可以使用以下代码:

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

Note that this would also cause it to use a notification instead of stdout when it's redirected with 100 or 101, though.如果这样不好,您将不得不改用显式的命令行参数--无论如何,我个人更喜欢这样做,因为它清楚地传达了意图,不会有意外.您可以接受添加到键盘快捷键但在命令行中调用工具时不使用的参数--notification.

如果由于某种原因不方便添加参数,您也可以使用具有不同名称的符号链接并选中os.Args[0].例如,如果您的程序是~/bin/hello,那么您将创建一个名为~/bin/hello-notify的"第二个版本",它实际上只是一个指向~/bin/hello的符号链接,但是在您的代码中,您可以判断os.Args[0]是否以-notify结尾.然后,您可以将键盘快捷键连接到~/bin/hello-notify,但在命令行中使用~/bin/hello.

Linux相关问答推荐

将参数#0更改为shell脚本不工作

动态链接ELF文件是否需要ELF节头表?

无法放弃所有权限,但可以放弃 CAP_SETUID 权限.

将(覆盖)文件移动到不同位置的同名文件夹中

无法在嵌入式 Linux 中使用 libjpeg 以 RGB888 在 LCD(黑色)上显示 JPEG

Linux 系统调用文档

sed 根据文件中的条件进行多次替换

根据其他列的值创建一个新列

查找在特定日期从特定机器登录的所有用户

std::system 使用什么Shell?

如何在 AWS Linux 服务器上实现虚拟主机?

CHMOD 755 与 750 权限集之间的差异

如何准确复制文件夹

在亚马逊 ec2 linux 微型实例上的 virtualenv 中安装 scipy 时遇到问题

在 Linux 上的进程之间传递消息的最快技术?

使用 C++ 和 Linux 的高分辨率计时器?

/var 中有什么?

用于提取 IP 地址的 Linux bash 脚本

网络共享文件夹上的 GIT 存储库中的并发性

如何拖尾除第一行以外的所有行