繁体   English   中英

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

[英]How can Linux program, e.g. bash or python script, know how it was started: from command line or interactive GUI?

我想做以下事情:

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

您可以检查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行为。 所以它远非完美。

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

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

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

yourcommand --gui

所以该计划将能够知道。

关于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警告。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM