shell 脚本能否确定用户是否在用户正在工作的同一 tty 上运行图形界面?
也许这甚至不可能?
编辑:
当用户在与用户正在处理的同一 tty 上运行窗口管理器时,我实际上正在尝试编写一个显示 GUI(通过使用 zenity/yad)的 shell 脚本。否则,脚本会退回到普通的命令行界面。
尝试检查变量TERM
,或者更准确地检查tset -q
. 终端的类型取决于它。在普通控制台中,它只是 Linux,而在大多数终端中,它是 xterm。
其他的事情是检查变量$DISPLAY
。大多数情况下,它是在您在 GUI 终端上运行时设置的。
一种可靠的方法是丢弃一些将立即终止的 GUI 进程,并检查退出状态。xterm 通常可用(尽管最新的 Linux Mint 默认没有它)并且可以立即退出:
xterm -iconic -e echo test && echo "Has a display"
-iconic 应该防止 xterm 在显示屏上闪烁(我希望这是一个通用选项)。
由于你的环境有zenity,如果不能使用显示器也会返回bad状态,并输出错误信息。您可以在 bash 中检测到这一点:
echo "" | zenity --progress --text "Display test" --auto-close 2> /dev/null
if [ $? -eq 0 ]
then
echo "has display"
fi
不幸的是,进度对话框在显示屏上闪现了片刻。这具有检测zenity本身是否不可用的额外好处。
我过去使用过 xterm 方法。
您真正想要测试的是是否存在 atty
或 pseudotty。
在 linux 上,使用命令tty
. 它将返回 0 并输出文件位置,或者在不是 tty 时tty
返回 1(false)并打印。not a tty
无论如何,该tset -q
命令都可以返回一个 TERM (例如linux
在我的情况下)。