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

Win*_*nix 6 bash nautilus symbolic-link

我在 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
Run Code Online (Sandbox Code Playgroud)

我检查了软链接,它看起来没问题:

lrwxrwxrwx  1 rick rick     30 Mar 26 10:14 Link to grub-display.sh -> /home/rick/bin/grub-display.sh*
Run Code Online (Sandbox Code Playgroud)

请注意,这是我今天刚刚发布的全新脚本:如何在不启动的情况下显示 grub 菜单和选项?. 在脚本中,clear使用的命令与此处和此处的TERM另一个线程中的错误消息相关联:如何修复 eclipse 中的“未设置 TERM 环境变量”警告

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

$ env | grep TERM
TERM=xterm-256color
Run Code Online (Sandbox Code Playgroud)

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

grub-display.shbash脚本从终端窗口中运行完全正常。

如何修复 Nautilus 为我创建的出现故障的桌面链接?

Win*_*nix 5

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

为了测试您的系统,创建一个名为的小脚本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
Run Code Online (Sandbox Code Playgroud)

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

$ cat ~/Downloads/test-term.txt

TERM environment variable: dumb
Using env | grep TERM output below:
(... blank line appears here ...)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,使用该命令时环境变量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
Run Code Online (Sandbox Code Playgroud)