Bash脚本的桌面快捷方式崩溃和烧伤

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

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

我翻阅了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在你打开一个终端时做了什么但在桌面快捷方式(链接)直接运行终端命令时丢失了?

grub-display.sh bash脚本从终端窗口运行得很好。

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

问题是脚本依赖于正在设置的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 

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

 $ cat ~/Downloads/test-term.txt TERM environment variable: dumb Using env | grep TERM output below: (... blank line appears here ...) 

正如您所看到的,当命令env | grep TERM时,环境变量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 

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

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