我想做以下事情:
如果 bash/python 脚本是从终端启动的,它应该执行一些操作,例如打印错误消息文本。如果脚本是从 GUI 会话启动的,比如从文件浏览器中双击,它应该做其他事情,例如显示一个 GUI 消息框。
我想做以下事情:
如果 bash/python 脚本是从终端启动的,它应该执行一些操作,例如打印错误消息文本。如果脚本是从 GUI 会话启动的,比如从文件浏览器中双击,它应该做其他事情,例如显示一个 GUI 消息框。
您可以检查是否连接到终端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
但是,您应该检查这是否适合您,因为它不能完全按照您的要求进行。但这是我能想到的最好的事情,它不依赖于太多的魔法。
DISPLAY
您也应该在使用 GUI 代码之前检查是否设置了环境变量,因为没有它就无法工作。
请注意,终端用户仍然可以重定向stdin
或重定向stdout
到/dev/null
(例如),这可能会导致您的程序与 GUI 行为一致。所以它远非完美。
最后,即使我已经给了你答案,请不要这样做!程序的行为会根据调用方式而改变,这让用户感到困惑。
它可以检查 的值$DISPLAY
来查看它是否在 X11 下运行,并$(tty)
查看它是否在交互式终端上运行。if [[ $DISPLAY ]] && ! tty; then
很有可能您希望显示一个 GUI 弹出窗口。
在作为 gnome/kde/whatever 中的菜单项的 .desktop 文件中,添加一个参数,例如
yourcommand --gui
这样程序就能知道了。
继续 LtWorf 的回答(我无法在评论中描述这一切)
除了参数之外,您还可以创建一个 shell 脚本,然后使用不同的名称创建第二个指向它的链接,例如somprog
“ gsomeprog
gsomeprog”等同于“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
警告。
您还可以运行一些 X11 实用程序,例如xdpyinfo
;如果它运行正确,你有一个 X11 服务器,所以你处于 GUI 模式,例如在 bash
if xdpyinfo | grep X.Org > /dev/null ; then