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
“解决方案” 不是在不检查退出状态的情况下反复运行所需环境之外的程序 。 dialog
, whiptail
等用于终端,因此它们当然需要设置TERM
。 所以你应该在终端上运行这些脚本。 如果在没有X11 / Wayland显示器的情况下运行,你的“高级”zenity,yad等也会发生同样的事情。
在脚本中,检查dialog
的输出,同时使用正常输出重定向错误输出。 因此,当对话框“崩溃并烧毁”并打印出错误消息时,您将比较if条件中的错误输出! 为什么要这么做?