Linux如何编程,例如bash或python脚本,知道它是如何启动的:从命令行还是交互式GUI?

时间:2013-01-29 21:12:51

标签: python linux bash user-interface command-line-interface

我想做以下事情:

如果从终端启动bash / python脚本,它应该执行诸如打印错误消息文本之类的操作。如果从GUI会话启动脚本,例如双击文件浏览器,它将执行其他操作,例如显示一个GUI消息框。

5 个答案:

答案 0 :(得分:9)

您可以查看stdinstdout是否已连接到终端。从GUI运行时,通常stdin根本没有连接,stdout连接到日志文件。从终端运行时,stdinstdout都将连接到终端。

在Python中:

import os
import sys

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

但是,您应该检查这是否适合您,因为它不能完全符合您的要求。但这是我能想到的最好的事情,它不依赖于太多的魔法。

在使用GUI代码之前,您应该检查DISPLAY环境变量是否已设置,因为没有它,它将不起作用。

请注意,终端用户仍然可以将stdinstdout重定向到/dev/null(例如),这可能会导致您的程序采用GUI行为。所以它远非完美。

最后,即使我已经给你一个答案,请不要这样做!用户对程序的行为进行更改会让人感到困惑,具体取决于它的调用方式。

答案 1 :(得分:4)

它可以检查$DISPLAY的值以查看它是否在X11下运行,并$(tty)查看它是否在交互式终端上运行。 if [[ $DISPLAY ]] && ! tty; then很有可能你想要显示一个GUI弹出窗口。

答案 2 :(得分:3)

在.desktop文件中,这是gnome / kde / whatever中的菜单项,添加一个参数,例如

yourcommand --gui

所以程序将能够知道。

答案 3 :(得分:2)

继续LtWorf的回答(我无法在评论中描述所有这些)


您可以创建一个shell脚本,然后使用不同的名称创建第二个链接,而不是参数,或者除了参数之外,例如somproggsomeprog,其中“gsomeprog”等效到“someprog -gui”

$ mv mydevdir/someprog /usr/local/bin
$ cd /usr/local/bin
$ ln someprog gsomeprog

在这种情况下,我更喜欢ln -s的硬链接,因为“两个”程序总是彼此相邻,永远不会留下悬空的软链接。

在shell脚本中,通过检查arg zero

检查用于调用它的名称
#!/bin/sh

mode=console

if [ $(basename ${0}) = gst -o "${1}" = "-gui" ]; then
    mode=gui
fi

echo "Mode is ${mode}"

当然,有比"${1}" = "-gui"更好的选项处理,但这仍然是读者的练习。


我喜欢Robie Basak的回答,但要注意他的someprog > /dev/null警告。

答案 4 :(得分:0)

您还可以运行一些像xdpyinfo这样的X11实用程序;如果它运行正常,你有一个X11服务器,所以你处于GUI模式,例如在bash中

if xdpyinfo | grep X.Org > /dev/null ; then