Pages : 1
#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.
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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
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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
Pages : 1