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 ?
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 solutionsEnvoyé 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.
ligne par ligne
ça marche en ligne par ligne, mais pas en script
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous,
N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton
et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
j'avais essayé mais rien
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #!/bin/bash F='\x04\x14\x40\x00\x00\xa8\x0f' fi="/dev/ttyACM0" printf $F >> $fi
Et comme ça ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #!/bin/bash F='\x04\x14\x40\x00\x00\xa8\x0f' fi="/dev/ttyACM0" printf "$F" >> $fi
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous,
N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton
et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
depuis le script
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 root@debian:/home/geo# printf $F | od -c 0000000 004 024 @ \0 \0 250 017 0000007
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 $
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous,
N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton
et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
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...
ok merci tests validés.
merci à vous trois de m'avoir éclairé.
![]()
Partager