Ярлык рабочего стола для скрипта 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! Почему ты бы так поступил?

Другие вопросы по тегам