Forum Programmation.shell script bash , OK sous ubuntu 7.10 mais KO sous ubuntu 8.04

Posté par  .
Étiquettes :
0
19
mar.
2009
voila j'ai modifié un petit script , il se lance sans problème sous gusty mais sous hardy il me retourne une erreur incompréhensible . Quelqu'un peut m'expliquer ?


gnu@robby:~/faust2.0/voice$ sh faustus2.sh


# execute un random dans l'interval(%) `ls *ogg | wc -l`
line=$(($RANDOM%`ls *wav | wc -l`))
+ ls test.wav test2.wav test3.wav test4.wav test5.wav
+ wc -l
faustus2.sh: 8: arithmetic expression: expecting primary: "%5"



gnu@robby:~/faust2.0/voice$ cat faustus2.sh

#!/bin/bash
#SCRIPT PLAY OGG
set -xv


# execute un random dans l'interval(%) `ls *ogg | wc -l`
line=$(($RANDOM%`ls *wav | wc -l`))
# ajoute une ligne car nl compte à partir de 1
line=$((line + 1))


# echo $?
SERVICE='gnash'

while ps ax | grep -v grep | grep $SERVICE > /dev/null


do


# execute un random dans l'interval(%) `ls *ogg | wc -l`
line=$(($RANDOM%`ls *wav | wc -l`))
# ajoute une ligne car nl compte à partir de 1
line=$((line + 1))


ls *wav | nl | while read a b
do
[ "$a" = "$line" ] && { /usr/bin/play "$b" ; }
done
done
  • # Ce n'est pas bash

    Posté par  . Évalué à 5.

    Le problème vient du fait que "sh" ne doit plus être bash mais un shell plus basique (genre dash) qui ne supporte pas $RANDOM. Pour que ça marche, lance ton script avec "bash faustus2.sh" ou simplement "./faustus2.sh"

    Explication plus longue :
    - La première ligne de ton script (le shebang) indique l'interpréteur à exécuter en cas de "./faustus2.sh". Mais dans ton exemple, tu le passes en paramètre d'une commande, qui ne tiendra donc pas compte du shebang.
    - /bin/sh est bien souvent un lien symbolique vers un autre shell, fut-ce bash, zsh, dash, ou autre (ce lien est configurable). Il me semble qu'Ubuntu a changé récemment et le lien ne pointe plus par défaut vers bash (un shell avec pas mal de fonctions), mais vers dash (un shell avec juste le strict nécessaire à la norme, plus rapide) qui ne supporte pas $RANDOM.
    • [^] # Re: Ce n'est pas bash

      Posté par  . Évalué à 1.

      Merci pour l'info ! :) Autre questions subsidiaire :

      pourquoi ils l'ont pas dit (ou c'est moi qui n'ai pas vue passer l'info ? )
      pourquoi ils l'ont changé ?
      Comment on fait pour revenir a l'environnement normal tel que la plupart des distros la connaissent et tel que sous ubuntu 7.10 ?

      Je commence à sentir sérieusement les limites de Dash
      • [^] # Re: Ce n'est pas bash

        Posté par  (site web personnel) . Évalué à 2.

        > pourquoi ils l'ont changé ?
        >> dash (un shell avec juste le strict nécessaire à la norme, plus rapide)

        > Comment on fait pour revenir a l'environnement normal tel que la plupart des distros la connaissent et tel que sous ubuntu 7.10 ?

        Probablement en faisant un update-alternatives. Genre 'sudo update-alternatives --config sh'.
        Mais de toute façon, si tu tiens à utiliser bash, lance ton script en faisant 'bash faustus.sh'. Si par contre tu veux utiliser sh, n'utilise pas de constructions qui ne sont pas dans la norme.
        • [^] # Re: Ce n'est pas bash

          Posté par  . Évalué à 1.

          je pensais que la norme c'était bash
          • [^] # Re: Ce n'est pas bash

            Posté par  . Évalué à 4.

            Le changement de shell par défaut à d'abord été fait par Debian, car dash consomme moins de mémoire que bash. Comme Debian ne vise pas seulement le desktop mais aussi l'embarqué ce choix tombe sous le sens. En effectuant ce changement les mainteneurs de Debian était conscients des limitations de dash et ont du modifier certains scripts.

            Les mainteneurs d'Ubuntu ont visiblement suivi, même si dans le cas d'Ubuntu l'embarqué n'est pas la cible principale. D'autre part visiblement l'utilisateur "standard" d'Ubuntu n'utilise pas la ligne de commande voire ne fait ses propres scripts.

            Personnellement je tiens compte dans mes scripts perso de cet état de fait et j'ai remplacé #!/bin/sh par #!/bin/bash dans la première ligne de mes scripts et je n'ai pas de problème!
        • [^] # Re: Ce n'est pas bash

          Posté par  . Évalué à 1.

          Heu ...


          gnu@robby:~/FAU$T.2.0/voice$ sudo update-alternatives --config sh
          [sudo] password for gnu:
          Pas d'alternatives pour sh.
          • [^] # Re: Ce n'est pas bash

            Posté par  . Évalué à 2.

            Visiblement bash n'est pas installé sur ton système. Tu devrais l'installer.......
            • [^] # Re: Ce n'est pas bash

              Posté par  . Évalué à 1.

              Sous Ubuntu, bash est installé par défaut.
              Par contre, si je regarde ton "cat" je vois qu'une ligne est sautée au début du fichier. Est-ce que la ligne #!/bin/bash est bien la PREMIÈRE ligne du fichier ?
              Si oui, tu dois pouvoir exécuter ton script avec ./mon_script : bash sera appelé automatiquement.
  • # Merci , ca marche

    Posté par  . Évalué à 2.

    Merci pour tous les commentaires , j'ai reussi à faire marcher le script finalement , j'ai désinstaller dash et mis bash , ce qui est étonnant c'est que le finger m'indiquait que bash était déjà installer . J'ai modifier un peu le script mais je n'ais pas touché à la fonction random vue que j'en ai besoin . Le shebang est bien en première ligne .

    Le script pour ceux que ca peut servir ,
    1.il cherche aléatoirement dans son répertoire un fichier *swf (si quelqu'un onnais un bon outil libre pour convertir du swf en format vidéo , pyvnc edit.py ne marche pas chez moi ) avec gnash en plein écran , une seule fois ,

    2. vérifie que le processus est lancé (ici gnash ) si oui alors lis aléatoirement des .wav tant que gnash est ouvert . Peut servir dans un contexte d'art numérique et autre multimédia .



    #!/bin/bash
    set -xv

    killall python
    line=$(($RANDOM%`ls *.swf | wc -l`))
    line=$(($line + 1))

    ls *.swf | nl | if read a b
    then

    #[ "$a" = "$line" ] && { /usr/bin/gnash "$b" & }

    [ "$a" = "$line" ] && { /usr/bin/gnash --once --fullscreen -r 1 "$b" & }

    fi
    SERVICE='gnash'

    while ps ax | grep -v grep | grep $SERVICE > /dev/null


    do


    # execute un random dans l'interval(%) `ls *ogg | wc -l`
    line=$(($RANDOM%`ls *wav | wc -l`))
    # ajoute une ligne car nl compte à partir de 1
    line=$((line + 1))


    ls *wav | nl | while read a b
    do
    [ "$a" = "$line" ] && { /usr/bin/play "$b" ; }
    done
    done

    • [^] # Re: Merci , ca marche

      Posté par  (site web personnel) . Évalué à 2.

      Si c'est juste $RANDOM qui manquait, il est possible de rajouter une ligne du genre
      RANDOM=$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d" ") dans le script et ça marchera sur tous les systèmes ayant un /dev/urandom (c'est peut-être moins fréquent que bash cependant).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.