如何让脚本检测终端仿真器是否正在桌面会话中运行?


10

我运行的脚本会写出一个文本文件,然后在编辑器中将其打开。如果我在桌面会话中打开终端仿真器窗口并运行脚本,我希望编辑器是图形化的,例如gedit。但是,如果我通过手机或类似设备(无桌面会话)上的ConnectBot登录,则希望编辑器为nano

目前,我必须维护2个不同的脚本,最后一步除外(或者运行图形脚本,然后关闭错误,然后在中手动打开文件nano)。从维护的角度来看,拥有两个几乎相同的脚本效率很低。

脚本可以检测到我处于哪种情况并打开正确的编辑器吗?

(我已经找到了一种脚本来检测它是否在终端仿真器窗口中运行或通过双击来运行的方法,但是还没有找到一种方法来检测该窗口是否在桌面中运行...我不认为我了解Google的正确术语)


6
如果您的脚本供其他人使用,则应使用$EDITOR默认情况下指定的程序,而不是nanonano如果未设置,则回退。
巴库里

谢谢,很棒的建议,很高兴听到好的做法。虽然只有我。
有机大理石

Answers:


13

您可以将环境变量$DISPLAY用作if条件内的触发器。通常,当此变量具有值时,您就可以运行图形应用程序。

这是一个示例:

if [[ -z $DISPLAY ]]
then
    nano
else
    gedit
fi

-z当envvar $DISPLAY为空并且您的脚本将运行时nano,该运算符将返回true ,在所有其他情况下它将运行gedit


根据@ vurp0的此评论:

在大多数现代Wayland台式机(如Fedora和Ubuntu中的默认台式机)上,$DISPLAY由于向后兼容(通过XWayland)仍设置了它,但是对于更健壮的脚本,最好同时进行测试$DISPLAY$WAYLAND_DISPLAY确定。

我建议以以下方式修改测试表达式:

[[ -z ${DISPLAY}${WAYLAND_DISPLAY} ]]

因此,这两个变量的值将被连接到一个通用字符串中,该字符串将由运算符处理-z


参考文献:


1
或明确的逻辑:[[ -z ${DISPLAY} && -z ${WAYLAND_DISPLAY} ]]
暂停,直到另行通知。

7

通常,虚拟终端使用/dev/pts伪终端。因此,基于tty命令的输出,我们可以构建一个简单的case语句来处理打开特定的编辑器:

case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac

或更格式化:

case "$(tty)" in
    "/dev/pts"*) gedit ;; 
    "/dev/tty"*) nano ;;
    *) echo "Not suitable tty" > /dev/stderr ;;
esac

与使用环境变量相比,这稍微可靠一些,并且考虑到它使用case带有tty命令的语句更便于移植。最好是将两者与额外的测试结合起来,例如"/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;


这不是错误的方法吗?在我的Ctrl + Alt + F1控制台上,tty给出/dev/tty1,而gnome-terminal(第一个选项卡)给出/dev/pts/0
帕迪·兰道

@PaddyLandau是的,gedit应该是/dev/pts*如此。我在tty中进行错误测试时切换了它们,最终将其复制到此处而没有切换回去。谢谢,已经编辑。
Sergiy Kolodyazhnyy

3

这就是我一直在使用的:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

产生此代码的原因是以下问题:Bash脚本的桌面快捷方式崩溃和烧伤

您可以将其修改为如下所示:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    nano ...
else
    gedit ...
fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.