如何让Linux程序(如bash或python脚本)知道是通过命令行还是交互式GUI启动的?

4 投票
5 回答
796 浏览
提问于 2025-04-17 14:07

我想实现以下功能:

如果这个bash或python脚本是从终端启动的,它就应该执行一些操作,比如打印一个错误信息。如果这个脚本是从图形界面(比如在文件浏览器中双击)启动的,它就应该执行其他操作,比如显示一个图形界面的消息框。

5 个回答

3

在.gnome/kde/whatever的.desktop文件中,添加一个参数,比如

yourcommand --gui

这样程序就能识别这个参数了。

4

它可以检查一下$DISPLAY的值,看看程序是不是在X11环境下运行的。同时,它还可以用$(tty)来判断程序是不是在一个可以交互的终端上运行。如果你看到if [[ $DISPLAY ]] && ! tty; then这样的代码,那就说明很有可能你想要显示一个图形界面的弹窗。

9

你可以检查一下 stdin(标准输入)和 stdout(标准输出)是否连接到了终端。一般来说,如果你是通过图形界面(GUI)来运行程序,stdin 通常是没有连接的,而 stdout 则会连接到一个日志文件。如果你是在终端中运行,那么 stdinstdout 都会连接到终端。

在 Python 中:

import os
import sys

if os.isatty(sys.stdout.fileno()):
    # print error message text
else:
    # display GUI message

不过你应该确认一下这个方法是否适合你,因为它并不完全符合你的要求。但这是我能想到的最简单的方法,而且不需要太多复杂的操作。

在使用图形界面代码之前,你还应该检查一下 DISPLAY 这个环境变量是否设置好了,因为没有它代码是无法工作的。

需要注意的是,终端用户仍然可以把 stdinstdout 重定向到 /dev/null(比如说),这可能会导致你的程序表现得像是在图形界面下运行。所以这个方法并不是完美的。

最后,虽然我给了你一个答案,但请不要这样做!因为程序的行为如果根据调用方式不同而变化,会让用户感到困惑。

撰写回答