web-dev-qa-db-fra.com

Le raccourci du bureau vers le script Bash se bloque et se grave

J'ai créé un lien dans Nautilus dans le répertoire ~/bin pour un script bash qui s'y trouve. Ensuite, j'ai coupé et collé le lien dans le répertoire ~/Desktop.

Quand je clique dessus, rien n'apparaît à l'écran. Si je fais un clic droit sur le lien et sélectionnez Run rien ne s'affiche non plus. Mais je sais que cela fonctionne parce que conky indique que plusieurs processeurs ont une charge élevée. Le pourcentage de CPU normal devrait être compris entre 5% et 8%, mais il oscille autour de 79%. Chaque instance du lien utilise environ 5% de la CPU plus systemd prend 5% de la CPU pour la journalisation. La température est normalement <50 ° C mais dans ce cas, elle oscille autour de 75 ° C.

J'ai fouillé à travers journalctl et trouvé le problème incriminant/en boucle:

$ journalctl -b-1 | grep 'TERM environment variable not set.' | wc
  35763  357630 3325959

J'ai vérifié le lien et ça a l'air correct:

lrwxrwxrwx  1 rick rick     30 Mar 26 10:14 Link to grub-display.sh -> /home/rick/bin/grub-display.sh*

Remarque il s’agit d’un tout nouveau script que je viens de publier aujourd’hui: Comment afficher le menu grub et les options sans démarrer? . Dans le script, la commande clear est utilisée et est liée à TERM messages d'erreur dans un autre thread ici et ici: Comment puis-je réparer la "variable d'environnement TERM not set "warning in Eclipse

Certaines des solutions au message d'erreur journalctl ci-dessus nécessitent un examen approfondi:

$ env | grep TERM
TERM=xterm-256color

Je me demande s’il s’agit de quelque chose que ~/.bashrc fait lorsque vous ouvrez un terminal, mais qui manque lorsqu’un raccourci sur le bureau (lien) exécute directement une commande de terminal?

Le script grub-display.sh bash s’exécute parfaitement à partir d’une fenêtre de terminal.

Comment puis-je résoudre ce lien de bureau défectueux que Nautilus a créé pour moi?

6
WinEunuuchs2Unix

Le problème est que le script repose sur la variable d'environnement TERM en cours de configuration. Ubuntu Unity Desktop ne l’a pas initialisé lors de l’appel de scripts. Si vous ouvrez un terminal avec Ctrl+Alt+T la variable est configurée.

Pour tester votre système, créez un petit script appelé test-term.sh et donnez-lui la forme suivante:

#!/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

Créez un lien dans Nautilus vers test-term.sh et exécutez le lien. Puis vérifiez le fichier de sortie:

$ cat ~/Downloads/test-term.txt

TERM environment variable: dumb
Using env | grep TERM output below:
(... blank line appears here ...)

Comme vous pouvez le constater, la variable d'environnement TERM est vide lorsque la commande env | grep TERM est utilisée. De plus, la variable $TERM est définie sur dumb, ce qui ne convient pas très bien à la commande basée sur la couleur et prise en charge par la souris dialog.


Solution de plaque chauffante

La solution à court terme consistait à inclure le code standard en haut des deux scripts en question:

# $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
4
WinEunuuchs2Unix

La "solution" est de ne pas exécuter de manière répétée des programmes en dehors de leur environnement requis sans vérifier leur statut de sortie . dialog, whiptail, etc., sont destinés aux terminaux. Ils nécessitent donc bien sûr le réglage de TERM. Donc, vous devriez exécuter ces scripts dans un terminal. Si votre zenity "avancé", votre yad, etc. étaient exécutés sans affichage X11/Wayland, il en serait de même.

Dans votre script, vous vérifiez la sortie de dialog tout en redirigeant la sortie d'erreur avec une sortie normale. Ainsi, lorsque la boîte de dialogue "se bloque et se grave" et affiche un message d'erreur, vous comparez alors la sortie d'erreur dans vos conditions if! Pourquoi ferais-tu ça?

0
Olorin