echo ne prend pas les options dans un script
Bonjour, Me voici confronté à un truc qui me dépasse un peu : echo comprend bien les options en ligne de commande mais plus dans un script ! Il y a un paramètre qqpart qui donne un comportement différent au bash en mode interactif ? En ligne de commande : for i in $(seq 1 5); do echo -en '.'; sleep 1; done; m'affiche bien sur la même ligne un point par seconde et sort. mais si je met ça dans un script et que je lance le script, ça donne : -en . -en . -en . -en . -en . Et tout aussi curieux: $sh -c "for i in $(seq 1 5); do echo -en '.'; sleep 1; done;" sh: Syntax error: word unexpected (expecting "do") OK, le sous shell marche pas dans ces conditions, on fait alors $sh -c "for i in 1 2 3 4 5; do echo -en '.'; sleep 1; done;" -en . -en . -en . -en . -en . C'est pas un pb d'espace insécable (j'ai fait un copier/coller), je vois vraiment pas... J'ai essayé echo -e -n "." mais ça change rien. Une idée ? Mon shell est malade ? (GNU bash, version 3.1.17(1)-release - i486-pc-linux-gnu) Daniel
On lun 13 novembre, Daniel Caillibaud wrote:
Une idée ? Mon shell est malade ? (GNU bash, version 3.1.17(1)-release - i486-pc-linux-gnu)
Ton /bin/sh doit être un lien vers un autre shell que bash, par exemple dash, qui lui ne supporte pas les options echo -e -n exemple : asyd@eva-01:~/tmp$ cat test.sh #!/bin/sh for i in $(seq 1 5); do echo -en '.'; sleep 1; done; asyd@eva-01:~/tmp$ /bin/dash ./test.sh -en . etc.. alors que : asyd@eva-01:~/tmp$ cat test.sh #!/bin/sh for i in $(seq 1 5); do /bin/echo -en '.'; sleep 1; done; asyd@eva-01:~/tmp$ /bin/dash ./test.sh ...... Quand tu ne spécifies pas un shell complet, ton shell va prefere la forme builtin si elle est dispo, ce qui me semble logique. Pour les fins observateurs, rassurez vous, NON, je ne suis pas revenu à bash. a+ -- http://asyd.net/home/ - Home Page http://guses.org/home/ - French Speaking (Open)Solaris User Group
On Mon, Nov 13, 2006 at 04:58:48PM +0100, Bruno Bonfils wrote:
Ton /bin/sh doit être un lien vers un autre shell que bash, par exemple dash, qui lui ne supporte pas les options echo -e -n
dash ne supporte pas l'option -e mais supporte l'option -n. De plus il semblerait que le comportement par défaut de dash soit l'équivalent de echo -e dans bash.
Julien Louis a écrit :
On Mon, Nov 13, 2006 at 04:58:48PM +0100, Bruno Bonfils wrote:
Ton /bin/sh doit être un lien vers un autre shell que bash, par exemple dash, qui lui ne supporte pas les options echo -e -n
dash ne supporte pas l'option -e mais supporte l'option -n. De plus il semblerait que le comportement par défaut de dash soit l'équivalent de echo -e dans bash.
Effectivement... ls -l /bin/sh lrwxrwxrwx 1 root root 4 2006-11-04 12:52 /bin/sh -> dash bash -c "for i in 1 2 3 4 5; do echo -en "."; sleep 1; done;" a bien le comportement escompté. En mettant #!/bin/bash, ça marche aussi (et moi qui était persuadé que #!/bin/sh était le plus portable...). Merci à vous, j'ai appris un truc :-) Daniel
On 2006-11-13 20:24:56 +0100, Daniel Caillibaud wrote:
En mettant #!/bin/bash, ça marche aussi (et moi qui était persuadé que #!/bin/sh était le plus portable...).
#!/bin/sh est plus portable, car bash n'est pas forcément installé. Il est bien connu que echo a des comportements différents, et il est souvent conseillé d'utiliser printf (mais il n'existe probablement pas sur de vieilles plateformes). -- Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/> 100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/> Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
Daniel Caillibaud <ml.dcailli@free.fr> (13/11/2006):
Bonjour,
Salut,
Me voici confronté à un truc qui me dépasse un peu : echo comprend bien les options en ligne de commande mais plus dans un script !
shebang = ?
En ligne de commande : for i in $(seq 1 5); do echo -en '.'; sleep 1; done; m'affiche bien sur la même ligne un point par seconde et sort.
OK ici.
mais si je met ça dans un script et que je lance le script, ça donne :
La même chose que précédemment chez moi, avec shebang = #!/bin/bash
Et tout aussi curieux: $sh -c "for i in $(seq 1 5); do echo -en '.'; sleep 1; done;" sh: Syntax error: word unexpected (expecting "do")
Non, pas curieux. Essaie avec « \$(seq 1 5) ».
C'est pas un pb d'espace insécable (j'ai fait un copier/coller), je vois vraiment pas... J'ai essayé echo -e -n "." mais ça change rien.
Une idée ?
Pour la seconde partie, oui, mais pas pour la première puisque problème non reproductible ici, désolé.
Mon shell est malade ? (GNU bash, version 3.1.17(1)-release - i486-pc-linux-gnu)
Ici : GNU bash, version 3.1.17(1)-release (powerpc-unknown-linux-gnu) HTH, -- Cyril Brulebois
participants (5)
-
Bruno Bonfils
-
Cyril Brulebois
-
Daniel Caillibaud
-
Julien Louis
-
Vincent Lefevre