Problème de variable d'environnement

Bonjour la communauté,

Je me suis lancé depuis quelque temps dans la programmation BASH de script pour mon petit RPi ZeRo. Et comme souvent je butte contre un problème, mais cette fois ci je ne trouve vraiment pas la solution ni sur le net ni dans ma tête. Alors je me suis dis que j’allais faire un appel à l’aide sur le forum de Raspbian-France.

Alors je suis sous Raspbian avec mon Pi Zero et je n’arrive pas à utiliser la variable d’environnement RANDOM dans mes scripts. De plus j’ai remarqué que certaines fonctionnaient et d’autre non sans explication apparente (enfin pour moi).
Par contre dans le SHELL pas de pb, tout fonctionne !

Par exemple si je tape dans le SHELL:

pi@RPi0:~ $ echo $RANDOM
23971
pi@RPi0:~

ou

pi@RPi0:~ $ echo $LANG
en_GB.UTF-8
pi@RPi0:~

Pas de soucis, ça fonctionne parfaitement.

Par contre si j’écris un script de ce style:

1 #!/bin/sh
2 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
3
4 echo $LANG
5 echo $RANDOM

Et que je le lance, voici le résultat:

pi@RPi0:~ $ sudo sh TEST.sh
en_GB.UTF-8

pi@RPi0:~ $

J’ai le droit a un espace vide comme si la variable RANDOM n’existait pas. Par contre la variable LANG fonctionne très bien :confused:

Est ce que quelqu’un sait ce qu’il se passe ? Parce que moi j’ai beau chercher, je ne trouve pas :pensive:

Merci d’avance.

Salut Tim!

Quelques indications, en vrac:

  1. RANDOM n’est pas une variable, c’est une fonction (tu dois obtenir une valeur différente à chaque fois que tu tapes ‹ echo $RANDOM ›
  2. ‹ Le SHELL › auquel tu fais référence n’est pas le même quand tu tapes des commandes dans la console et quand tu lances un ‹ sudo sh TEST.sh ›: les commandes que tu tapes dans la console sont (vraisemblablement) exécutées par le shell /bin/bash, tandis que tu appelles le shell /bin/sh (ça peut aussi dépendre de ce qu’on trouve dans les répertoires listés dans $PATH) quand tu tapes ‹ sudo sh TEST.sh ›
  3. La ligne vide que tu obtiens à l’exécution de ‹ echo $RANDOM › dans le script est le comportement attendu du shell /bin/sh, quand on lui demande d’afficher une variable qui n’a pas encore été initialisée: le shell /bin/sh ne connait pas a priori de variable RANDOM (et encore moins la fonction RANDOM).
  4. Je pense que ‹ sudo bash TEST.sh › devrait t’aider à avancer.
  5. As-tu besoin d’exécuter ton script en tant que root ? Si la réponse est non, alors tu peux tout aussi bien taper: ‹ bash TEST.sh ›.
  6. Une autre façon de faire consiste à taper: ‹ . TEST.sh › (mais la prise en compte des variables d’environnement diffère dans ce cas par rapport à ce que je propose en 5)
  7. dans tous les cas précédents la première ligne (’#!/bin/sh’) ne sert à rien: c’est juste un commentaire parmi les lignes de commandes que l’on demande d’exécuter à l’interpréteur
  8. On peut faire du script TEST.sh une commande qui se lance comme une commande système:

~chmod +x TEST.sh
~./TEST.sh

Dans ce cas, la première ligne est interprétée pour lancer un interpréteur éventuellement différent.
Exemple de fichier qui invoque un interpréteur différent:
#!/bin/python3
print(‹ Hello! ›)

  1. Le nom de fichier script « TEST.sh » n’est pas a priori ambigu. Personnellement j’évite le mot ‹ TEST › pour les noms de fichiers à cause de la confusion possible avec l’exécutable /usr/bin/test

J’espère que tout ça t’a aidé.

Bons shell-scripts!

Ah super, merci Phi31 !
Effectivement en tapant « sudo bash TEST.sh » j’obtiens bien une nombre aléatoire comme prévu.
Donc tu dis que RANDOM n’est pas une variable mais une fonction. Tu me dis si je me trompe mais si j’ai bien compris cette fonction créer tout de même une variable que l’on peut lire avec « echo $RANDOM » pour obtenir un nombre aléatoire.
En tout cas merci pour toute ces explications, ça m’a permis d’éclaircir quelques questions que je me posais.