Ярлык рабочего стола для скрипта Bash аварийно завершает работу
Я создал ссылку в Nautilus в ~/bin
каталог для скрипта bash, расположенный там. Затем я вырезал и вставил ссылку в ~/Desktop
каталог.
Когда я нажимаю на него, на экране ничего не появляется. Если я щелкну правой кнопкой мыши по ссылке и выберите Run
тоже ничего не появляется. Но я знаю, что он работает, потому что conky
показывает несколько процессоров, имеющих высокую нагрузку. Нормальный CPU% должен составлять от 5% до 8%, но он колеблется около 79%. Каждый экземпляр ссылки занимает около 5% процессора плюс systemd
занимает 5% процессора для ведения журнала. Температура обычно < 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
сообщения об ошибках в другой ветке здесь и здесь: как я могу исправить предупреждение "переменная окружения TERM не установлена" в eclipse
Некоторые из решений journalctl
Сообщение об ошибке выше требует просмотра:
$ env | grep TERM
TERM=xterm-256color
Мне интересно, если это что-то ~/.bashrc
происходит, когда вы открываете терминал, но отсутствует, когда ярлык на рабочем столе (ссылка) запускает команду терминала напрямую?
grub-display.sh
bash скрипт отлично работает из окна терминала.
Как я могу исправить эту неработающую ссылку Desktop, созданную для меня Nautilus?
2 ответа
Проблема в том, что скрипт опирается на 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 ...)
Как вы можете видеть переменную среды 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
установить. Таким образом, вы должны запустить эти скрипты в терминале. То же самое могло бы случиться с вашим "продвинутым" zenity, yad и т. Д., Если бы вы работали без дисплея X11/Wayland.
В вашем скрипте вы проверяете вывод dialog
в то время как перенаправление вывода ошибок с нормальным выводом. Поэтому, когда диалог "вылетает и горит" и печатает сообщение об ошибке, вы сравниваете вывод ошибки в ваших условиях if! Почему ты бы так поступил?