我有我运行的脚本,它写出一个文本文件,然后在编辑器中打开它。如果我在桌面会话中打开终端仿真器窗口并运行脚本,我希望编辑器是图形编辑器,例如gedit
. 但是,如果我通过手机或类似设备上的 ConnectBot 登录(没有桌面会话),我希望编辑器是nano
.
目前我必须维护 2 个不同的脚本,除了最后一步(或者让图形运行,错误关闭,然后手动打开文件nano
)。从维护的角度来看,拥有两个几乎相同的脚本是低效的。
脚本能否检测到我所处的这些情况,并打开正确的编辑器?
(我已经找到了让脚本检测它是在终端仿真器窗口中运行还是通过双击运行的方法,但还没有找到检测窗口是否在桌面中运行的方法......我不认为我知道谷歌的正确术语)
您可以将环境变量
$DISPLAY
用作if
条件内的触发器。通常,当此变量具有值时,您就可以运行图形应用程序。这是一个bash示例:
-z
当 envvar$DISPLAY
为空并且您的脚本将运行时,该运算符将返回 truenano
,在所有其他情况下它将运行gedit
。根据@vurp0的评论:
我建议通过以下方式修改测试表达式:
因此,两个变量的值将连接成一个公共字符串,由 operator 处理
-z
。参考:
通常虚拟终端使用
/dev/pts
伪终端。因此,根据tty
命令的输出,我们可以构建一个简单的case
语句来处理打开特定编辑器:或者格式更好:
与使用环境变量相比,这稍微可靠一些,并且考虑到它使用
case
带有命令的语句tty
稍微更便携。可能最好的办法是将两者结合起来,并进行额外的测试,例如"/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;
这是我一直在使用的:
这段代码的原因是这个问题:Desktop shortcut to Bash script crash and burns
您可以将其修改为如下所示: