我想做以下事情:
如果从终端启动bash / python脚本,它应该执行诸如打印错误消息文本之类的操作。如果从GUI会话启动脚本,例如双击文件浏览器,它将执行其他操作,例如显示一个GUI消息框。
答案 0 :(得分:9)
您可以查看stdin
和stdout
是否已连接到终端。从GUI运行时,通常stdin
根本没有连接,stdout
连接到日志文件。从终端运行时,stdin
和stdout
都将连接到终端。
在Python中:
import os
import sys
if os.isatty(sys.stdout.fileno()):
# print error message text
else:
# display GUI message
但是,您应该检查这是否适合您,因为它不能完全符合您的要求。但这是我能想到的最好的事情,它不依赖于太多的魔法。
在使用GUI代码之前,您应该检查DISPLAY
环境变量是否已设置,因为没有它,它将不起作用。
请注意,终端用户仍然可以将stdin
或stdout
重定向到/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脚本,然后使用不同的名称创建第二个链接,而不是参数,或者除了参数之外,例如somprog
和gsomeprog
,其中“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