bonjour, dans un terminal lorsque je tape printf '\x04\x14\x01\x00\x00\xe7\x0f' >>/dev/ttyACM0, ça marche la carte reliée opère
Lorsque je mets ça dans un script sh ça marche pas.
Pourquoi ?
Version imprimable
bonjour, dans un terminal lorsque je tape printf '\x04\x14\x01\x00\x00\xe7\x0f' >>/dev/ttyACM0, ça marche la carte reliée opère
Lorsque je mets ça dans un script sh ça marche pas.
Pourquoi ?
Je pense que le shell de ton terminal n'est pas un le même shell que celui que tu lances dans ton script.
Deux solutionsCitation:
Envoyé par man printf
- tu changes le shell utilisé dans ton script (pour le bash par exemple), si cela n'entraine pas trop de modification.
- tu utilises le chemin absolu de la commande printf (/usr/bin/printf normalement)
J'utilise bien bash et je mets le chemin complet de printf
Alors pourquoi ça marche pas ?Code:
1
2
3
4
5 #!/bin/bash F="'\x04\x14\x01\x00\x00\xe7\x0f'" echo $F fi="/dev/ttyACM0" /usr/bin/printf $F >> $fi
c'est très utile comme description ;)Citation:
ça marche pas
pourquoi des apostrophes entre guillemets ?
BASH à son propre printf, qui fonctionne très bien.
alors,
j'ai une carte avec des relais reliée par usb. Ma debian la reconnait comme /dev/ttyACM0
dans un terminal lorsque je tape
printf '\x04\x14\x01\x00\x00\xe7\x0f' >>/dev/ttyACM0
le relais 1 se ferme
je voulais un peu scripter tout ça.
donc je lance mon script et rien pas de message d'erreur et pas non plus mon relais qui se ferme.
du coup j'ai fais un echo de la commande envoyée, copier collée dans un terminal et là le relais se ferme.
et si tu copies les commandes du script dans un terminal, ligne par ligne...
que se passe-t-il ?
ligne par ligne
ça marche en ligne par ligne, mais pas en scriptCode:
1
2
3 F='\x04\x14\x01\x00\x00\xe7\x0f' (j'ai enlevé les guillemets) fi="/dev/ttyACM0" printf $F >> $fi
Et en enlevant les guillemets aussi dans le script ?
j'avais essayé mais rien
Code:
1
2
3
4 #!/bin/bash F='\x04\x14\x40\x00\x00\xa8\x0f' fi="/dev/ttyACM0" printf $F >> $fi
Et comme ça ?
Code:
1
2
3
4 #!/bin/bash F='\x04\x14\x40\x00\x00\xa8\x0f' fi="/dev/ttyACM0" printf "$F" >> $fi
y a-t-il une différence entre printf $F | od -c quand c'est exécuté dans le script, ou sur la ligne de commande ?
toujours pas
depuis le scriptCode:
1
2
3 root@debian:/home/geo# printf $F | od -c 0000000 004 024 @ \0 \0 250 017 0000007
Code:
1
2
3
4 sh lacry.sh 0000000 \ x 0 4 \ x 1 4 \ x 4 0 \ x 0 0 0000020 \ x 0 0 \ x a 8 \ x 0 f 0000034
Voici les résultats de mes tests :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 $ F='\x04\x14\x01\x00\x00\xe7\x0f' $ printf $F | od -c 0000000 004 024 001 \0 \0 ç 017 0000007 $ printf "$F" | od -c 0000000 004 024 001 \0 \0 ç 017 0000007 $ cat <<fin >tst.sh > F='\x04\x14\x01\x00\x00\xe7\x0f' > printf $F | od -c > printf "$F" | od -c > fin $ chmod +x ./tst.sh $ ./tst.sh 0000000 x 0 4 x 1 4 x 0 1 x 0 0 x 0 0 x 0000020 e 7 x 0 f 0000025 0000000 004 024 001 \0 \0 ç 017 0000007 $
j'ai également fait des tests sur Debian.
sh est un lien vers dash, qui dispose d'une commande printf, et qui affiche la sortie erronée.
bash, lui, se comporte correctement.
donc, soit tu utilises (da)sh avec /usr/bin/printf, soit tu utilises bash avec la comande interne printf.
accessoirement, voilà pourquoi on n'exécute pas un shell ainsi, mais en y mettant un shebang à la première ligne, en le rendant exécutable, et en le lançant come un programme ordinaire :/chemin/script, ou si le script est dans le répertoire courant (qui n'est pas dans le PATH) ./script.
et voilà je vais finir par me faire gronder...
Alors si j'ai bien compris :
sh lance dash qui n'interprète pas de la même manière printf que bash
si on met un shebang et que l'on lance sh scriot.sh est-il interprété ?
J'ai fait un essai depuis chez moi sans la carte avec ./script.sh. Effectivement le retour de la commande printf $F | od -c est sans équivoque possible. Une bonne chose.
Je ferai l'essai demain depuis la machine de développement reliée à la carte avant de marquer résolu
En attendant je vais tirer les oreilles à ce prof qui m'a appris le shell script qu'avec sh donc dash...
non, le shebang ne sera pas pris en compte, c'est le shell vers quoi pointe le premier sh trouvé dans le PATH, qui exécutera le shell.Citation:
si on met un shebang et que l'on lance sh scriot.sh est-il interprété ?
ok merci tests validés.
merci à vous trois de m'avoir éclairé.
:ccool: