Bash 脚本的桌面快捷方式崩溃并烧毁

Bash 脚本的桌面快捷方式崩溃并烧毁

我在 Nautilus 目录中~/bin为位于该目录中的 bash 脚本创建了一个链接。然后我将链接剪切并粘贴到~/Desktop目录中。

当我单击它时,屏幕上什么也没有出现。如果我右键单击链接并选择,Run也不会出现任何内容。但我知道它正在运行,因为conky显示多个 CPU 负载很高。正常的 CPU% 应该是 5% 到 8%,但它徘徊在 79% 左右。链接的每个实例占用大约 5% 的 CPU,另外systemd日志记录占用 5% 的 CPU。温度通常小于 50C,但在这种情况下,它徘徊在 75C 左右。

我仔细检查了一下journalctl,发现了有问题/循环的问题:

$ journalctl -b-1 | grep 'TERM environment variable not set.' | wc
  35763  357630 3325959

我检查了软链接并且看起来没问题:

lrwxrwxrwx  1 rick rick     30 Mar 26 10:14 Link to grub-display.sh -> /home/rick/bin/grub-display.sh*

笔记这是我今天刚刚发布的全新脚本:如何在不启动的情况下显示 grub 菜单和选项?. 在脚本中clear使用链接到TERM另一个线程中的错误消息的命令这里和这里:如何修复 eclipse 中的“TERM 环境变量未设置”警告

上述错误消息的一些解决方案journalctl需要查看:

$ env | grep TERM
TERM=xterm-256color

我想知道~/.bashrc当您打开终端时是否会发生这种情况,但是当桌面快捷方式(链接)直接运行终端命令时是否会丢失?

bashgrub-display.sh脚本在终端窗口运行得很好。

我该如何修复 Nautilus 为我创建的这个故障的桌面链接?

答案1

问题是脚本依赖于TERM正在设置的环境变量。调用脚本时,Ubuntu Unity Desktop 不会初始化此变量。如果您使用Ctrl++打开终端AltT则变量已设置。

为了测试您的系统,请创建一个名为的小脚本test-term.sh并使其看起来像这样:

#!/bin/bash

#See if $TERM has been set when called from Desktop shortcut

echo TERM environment variable: $TERM > ~/Downloads/test-term.txt
echo "Using env | grep TERM output below:" >> ~/Downloads/test-term.txt
env | grep TERM >> ~/Downloads/test-term.txt

exit 0

在 Nautilus 中创建一个链接test-term.sh并运行该链接。然后检查输出文件:

$ cat ~/Downloads/test-term.txt

TERM environment variable: dumb
Using env | grep TERM output below:
(... blank line appears here ...)

如您所见,使用TERM该命令时环境变量为空env | grep TERM。此外,变量$TERM设置为dumb与基于颜色、支持鼠标的命令不太相符dialog


样板解决方案

短期解决方案是在相关两个脚本的顶部包含样板代码:

# $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

答案2

“解决方案”是不要在没有检查退出状态的情况下重复运行所需环境之外的程序. dialogwhiptail等适用于终端,因此当然需要TERM设置。因此,您应该在终端中运行这些脚本。如果您的“高级” zenity、yad 等没有 X11/Wayland 显示,也会发生同样的事情。

在您的脚本中,您检查了输出,dialog同时将错误输出重定向为正常输出。因此,当对话框“崩溃并烧毁”并打印错误消息时,您会在 if 条件中比较错误输出!您为什么要这样做?

相关内容