Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/06/2012, à 18:26

robert leleu

Bad substitution

Voici une séquence de terminal (extraction du jour à partir de la date d’un fichier)
leleu@portable-leleu:~$ date=$(stat -c %y ~/MuseScore/build.release/mscore)
leleu@portable-leleu:~$ echo $date
2012-06-27 12:27:49.000000000 +0200
leleu@portable-leleu:~$ jour=${date:0:10}
leleu@portable-leleu:~$ echo $jour
2012-06-27

je veux la transposer dans un script bash et j’écris

date=$(stat -c %y ~/MuseScore/build.release/mscore)
jour=${date:0:10}
cela échoue avec le message
2: Bad substitution


quelqu’un sait-il ? Merci

Hors ligne

#2 Le 27/06/2012, à 18:43

pingouinux

Re : Bad substitution

Bonjour,
Est-ce bien un script bash (#!/bin/bash en première ligne) ?

Hors ligne

#3 Le 27/06/2012, à 22:08

robert leleu

Re : Bad substitution

j’avais négligé, car je ne savais pas les conséquences de la non-déclaration
En prime gedit colore le script

Merci, en particulier pour ta vigilance.

Hors ligne

#4 Le 28/06/2012, à 01:20

nesthib

Re : Bad substitution

Pour expliquer un peu, cette déclaration s'appelle un shebang. Il s'agit d'un commentaire (à cause du caractère « # ») un peu spécial qui permet, lorsqu'un script n'est pas lancé de façon explicite (ex. « bash mon_script.sh ») de déterminer l'interpréteur de commandes à lancer.

spécifier :

#!/bin/bash

équivaut donc à lancer

bash le_script.sh

de même :

#!/usr/bin/python

indique que l'interpréteur de commande à lancer est python.

Il est possible que d'un système à l'autre l'emplacement des exécutables ne soit pas exactement le même. C'est pourquoi tu trouves parfois la syntaxe :

#!/usr/bin/env python

Dans ce cas c'est le programme env (dont l'emplacement est relativement standardisé) qui va déterminer l'emplacement de l'exécutable, et le lancer.

smile


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#5 Le 28/06/2012, à 10:29

robert leleu

Re : Bad substitution

Ce qui m’a désarçonné c’est que je n’ai trouvé nulle part quelle est cette substitution qualifiée de mauvaise.....
serait-ce un mauvais choix (automatique) de l’interpréteur ?
J’ai pourtant cru lire que bash est l’interpréteur par défaut.

Hors ligne

#6 Le 28/06/2012, à 10:43

Kshegzyaj

Re : Bad substitution

bash est bien l'interpréteur par défaut lorsque l'on ouvre une console. Mais, si je ne me trompe pas, pour l'éxécution d'un script, c'est sh qui est utilisé par défaut. Et il me semble que les syntaxes suivantes sont spécifiques à bash :

$(commande)
${expression}

Et que pour être compatible avec un plus grand nombre de shells, il faut utiliser cette syntaxe :

`commande`

Cependant, cette syntaxe est moins pratique, en particulier lorsque l'on veut les imbriquer.

Pour la petite histoire, sur la plupart des distributions récentes, sh est un lien vers dash. Le lien est créé pour éviter de devoir revenir sur de vieux scripts.

Dernière modification par Kshegzyaj (Le 28/06/2012, à 10:44)


Netbook : Asus Eee 1215B / AMD C-60 / 4Go RAM / Radeon HD 6290 / Ubuntu 12.04
Laptop : Packard Bell EasyNote TM85 / Intel Core i5-430M / 4Go RAM / Windows Seven
Fixe : Packard Bell ? / Intel Pentium 4 / 2 Go RAM / Nvidia Geforce 6200LE / Windows XP et Ubuntu 12.04
Console : Nintendo Wii / IBM Broadway / 76 Mo RAM / ATI Hollywood / Debian Lenny

Hors ligne

#7 Le 28/06/2012, à 15:25

nesthib

Re : Bad substitution

Comme le précise Kshegzyaj, la syntaxe :

$(commande)

est spécifique à bash. Elle est appelée substitution de commande (command substitution), c'est donc bien l'origine de ton problème.

NB. la syntaxe :

`commande`

est équivalent mais considérée comme obsolète (car elle est ambiguë) dans bash. À ne pas utiliser donc si le script ne doit pas être à tout prix compatible avec des vieilles versions de bash/sh.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#8 Le 28/06/2012, à 16:35

pingouinux

Re : Bad substitution

Je pense que c'est plutôt cette ligne qui est en cause (le n° de la ligne est indiqué dans le message d'erreur) :

jour=${date:0:10}
$ cat mon_script.sh
date=$(stat -c %y ./mon_script.sh)
echo $date
jour=${date:0:10}
echo $jour
$ /bin/bash -c ./mon_script.sh
2012-06-28 16:29:04.000000000 +0200
2012-06-28
$ /bin/sh -c ./mon_script.sh
2012-06-28 16:29:04.000000000 +0200
./mon_script.sh: 3: Bad substitution

Hors ligne

#9 Le 28/06/2012, à 16:59

nesthib

Re : Bad substitution

Effectivement ! Je n'ai pas pris le temps de relire le message d'erreur wink

Ce qui est étrange c'est que la syntaxe ${VAR:…} est appelée « parameter expansion » aussi bien dans bash que sh… (mais sh ne gère pas les expansions complexes)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne