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

Org*_*ble 10 scripts virtual-console desktop-environments

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

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

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

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

pa4*_*080 13

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

这是一个示例:

if [[ -z $DISPLAY ]]
then
    nano
else
    gedit
fi
Run Code Online (Sandbox Code Playgroud)

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


根据@vurp0 的评论:

在大多数现代 Wayland 桌面(如 Fedora 和 Ubuntu 中的默认桌面)上,$DISPLAY由于向后兼容性(通过 XWayland),仍然设置,但对于更强大的脚本,最好对两者进行测试$DISPLAY$WAYLAND_DISPLAY确定。

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

[[ -z ${DISPLAY}${WAYLAND_DISPLAY} ]]
Run Code Online (Sandbox Code Playgroud)

因此,两个变量的值将连接成一个公共字符串,该字符串将由 operator 处理-z


参考:


Ser*_*nyy 7

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

case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac
Run Code Online (Sandbox Code Playgroud)

或者更好地格式化:

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

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