4

我想做以下事情:

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

4

5 回答 5

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

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

DISPLAY您也应该在使用 GUI 代码之前检查是否设置了环境变量,因为没有它就无法工作。

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

最后,即使我已经给了你答案,请不要这样做!程序的行为会根据调用方式而改变,这让用户感到困惑。

于 2013-01-29T21:27:12.110 回答
4

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

于 2013-01-29T21:15:56.840 回答
3

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

yourcommand --gui

这样程序就能知道了。

于 2013-01-29T21:17:49.217 回答
2

继续 LtWorf 的回答(我无法在评论中描述这一切)


除了参数之外,您还可以创建一个 shell 脚本,然后使用不同的名称创建第二个指向它的链接,例如somproggsomeproggsomeprog”等同于“someprog -gui”

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

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

在 shell 脚本中,通过检查 arg 零来检查用于调用它的名称

#!/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警告。

于 2013-01-29T21:41:11.883 回答
0

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

if xdpyinfo | grep X.Org > /dev/null ; then
于 2013-01-30T06:35:46.843 回答