IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

printf dans sh


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 17
    Par défaut printf dans sh
    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 ?

  2. #2
    Membre éprouvé Avatar de eric-m
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Par défaut
    Je pense que le shell de ton terminal n'est pas un le même shell que celui que tu lances dans ton script.

    Citation Envoyé par man printf
    NOTE: your shell may have its own version of printf, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supports.
    Deux solutions
    • 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)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 17
    Par défaut
    J'utilise bien bash et je mets le chemin complet de printf

    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 pourquoi ça marche pas ?

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    ça marche pas
    c'est très utile comme description

    pourquoi des apostrophes entre guillemets ?
    BASH à son propre printf, qui fonctionne très bien.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 17
    Par défaut
    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.

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    et si tu copies les commandes du script dans un terminal, ligne par ligne...
    que se passe-t-il ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 17
    Par défaut
    ligne par ligne

    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
    ça marche en ligne par ligne, mais pas en script

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    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.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 17
    Par défaut
    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

  10. #10
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    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.

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    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 ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 17
    Par défaut
    toujours pas

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 17
    Par défaut
    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
    depuis le script
    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

  14. #14
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    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.

  15. #15
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    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.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 17
    Par défaut
    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...

  17. #17
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    si on met un shebang et que l'on lance sh scriot.sh est-il interprété ?
    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.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 17
    Par défaut
    ok merci tests validés.
    merci à vous trois de m'avoir éclairé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. bash: printf dans variable bash
    Par Invité dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 22/10/2011, 03h44
  2. Réponses: 1
    Dernier message: 14/03/2011, 23h23
  3. Redirection de printf dans une QTextEdit
    Par mackmack dans le forum Débuter
    Réponses: 2
    Dernier message: 20/12/2010, 10h29
  4. affichage de printf dans un script bash
    Par kass28 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 19/03/2008, 21h36
  5. Probleme pour afficher des printf dans le main
    Par Battosaiii dans le forum C
    Réponses: 4
    Dernier message: 13/03/2006, 10h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo